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 回答