JavaプログラマーでありC ++の初心者である私は、C ++での継承を扱うのに苦労しています。今、私はこれを持っています:
class Parent {
public:
Parent() {}
virtual std::string overrideThis() { }
};
class Child : public Parent {
public:
std::string attribute;
Child(const std::string& attribute) : attribute(attribute) { }
std::string overrideThis(){
std::cout << "I'm in the child" << std::endl;
return attribute.substr(1, attribute.size()-2);
}
};
そして、このスニペットはどこか別の場所にあります。
Child *child = new Child(value);
Child childObject = *(child);
std::cout << "I'm trying this: " << childObject.overrideThis() << endl;
上記のコードは期待どおりに機能し、メッセージが画面に出力されます。しかし、その代わりに私がこれを試してみる場合:
Child *child = new Child(value);
Parent childObject = *(child);
std::cout << "I'm trying this: " << childObject.overrideThis() << endl;
画面に面白いキャラクターがたくさんいる面白いランタイムエラーがあります。ポインターでポリモーフィズムを使用する適切な方法は何ですか?私がやろうとしているのは、Child
インスタンスでoverrideThis()を呼び出すことです
呼び出されている関数がParent::overrideThis
戻らないため、プログラムの動作は未定義ですが、返されます。
関数Parent
ため、クラスが呼び出されParent childObject = *(child);
、スライス新しいオブジェクトを、 -あなたがコピーしようとするオブジェクトがchildObject
型であるParent
、ではありませんChild
。
ポリモーフィズムが機能するには、ポインターまたは参照のいずれかを使用する必要があります。
Parent* childObject1 = child;
Parent& childObject2 = *child;
childObject1->overrideThis();
childObject2.overrideThis();
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加