0

当たり障りのない基本型への参照を保持する配列があります。それを呼び出しましょうObject

Class1私はから派生ObjectClass2ましたClass1

#include <vector>

class Object {};
class Class1 : public Object {
public:
virtual std::string ToString() {return "it is 1";}
};
class Class2 : public Class1 {
public:
    virtual std::string ToString() {return "it is 2";}
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Object *> myvec;
    myvec.push_back(new Class2());
    printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());
    return 0;
}

ToString()私はキャストしObject *て電話しClass1 *ます

    printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());

私の質問は、オブジェクトが実際にあるClass2が、具体的にはそれにダウンキャストされていない場合、この出力は1または2になるのでしょうか?キーワードはvirtual意図した効果を持っていますか?

4

3 に答える 3

3

Class2オブジェクトはそのタイプであるため、の仮想関数を呼び出す必要があります。

注意:仮想関数の目的は、実際のクラスの関数を呼び出すことであり、ポインター/参照が現在表示されているクラスの関数ではありません。

于 2011-12-10T23:15:28.490 に答える
2

悪魔とあなたの鼻孔に関して、私が最初に答えたとき、私はあなたの質問を少し読み間違えました。

キーワードはvirtual意図した効果をもたらします。つまり、2が表示されます。にキャストしましたClass1が、vtableは魔法のように機能します。

于 2011-12-10T23:17:42.357 に答える
1

まず、これは安全なキャストではありません。ただしmyvec[i]、それがキャスト先のオブジェクトへのポインタであるとすると、そのクラスに適切なメソッドが呼び出されます。

于 2011-12-10T23:20:51.777 に答える