0

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() を呼び出すことです

4

1 に答える 1

2

呼び出されている関数がParent::overrideThis返されないため、プログラムの動作は未定義です。

Parentクラス内の関数が呼び出されるのは、コピーしようとしているオブジェクトをParent childObject = *(child); スライスするためです。新しいオブジェクトchildObjectのタイプParentは ではなくChildです。

ポリモーフィズムを機能させるには、ポインターまたは参照のいずれかを使用する必要があります。

Parent* childObject1 = child;
Parent& childObject2 = *child;
childObject1->overrideThis();
childObject2.overrideThis();
于 2013-07-06T05:58:06.983 に答える