我有一个数组,其中包含对平淡基本类型的引用,我们称它为 Object
。
我从 Object
派生了 Class1
,从 Class1
派生了 Class2
。
#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;
}
我通过从 Object *
转换为 Class1 *
来调用 ToString()
printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());
我的问题是,当对象实际上是 Class2
但不是具体向下转换时,它会输出 1 还是 2? virtual
关键字是否具有预期效果?
最佳答案
它应该调用 Class2
的虚函数,因为该对象属于该类型。
记住:虚函数的目的是调用实际类的函数,而不是指针/引用当前看起来是的类的函数。
关于C++ 多态性,不完全向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460649/