C++ C++;多态性,不完全向下投射
我有一个数组,它包含对一个平淡的基类型的引用,我们称它为C++ C++;多态性,不完全向下投射,c++,polymorphism,virtual-functions,static-cast,C++,Polymorphism,Virtual Functions,Static Cast,我有一个数组,它包含对一个平淡的基类型的引用,我们称它为对象 我从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: virtua
对象
我从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;
}
我的问题是,当对象实际上是
Class2
而不是具体向下转换到该类时,该输出是1还是2?virtual
关键字是否具有预期效果?它应该调用Class2
的virtual函数,因为对象属于该类型
请记住:虚拟函数的目的是调用实际类的函数,而不是指针/引用当前显示的类的函数。它应该调用
Class2
的虚拟函数,因为对象属于该类型
请记住:虚拟函数的目的是调用实际类的函数,而不是指针/引用当前显示的类的函数。当我第一次回答关于恶魔和鼻孔的问题时,我稍微误解了你的问题
virtual
关键字将产生预期效果。也就是说,您将看到2。虽然您已铸造到Class1
,但vtable将发挥作用,因为它很神奇。当我第一次回答您关于恶魔和鼻孔的问题时,我有点误读了您的问题
virtual
关键字将产生预期效果。也就是说,您将看到2。虽然您已施法到Class1
,但vtable将起作用,因为它很神奇。首先,这不是安全施法。但是假设myvec[i]
是您要强制转换到的对象的指针,那么它将为该类调用适当的方法。首先,这不是一个安全强制转换。但是假设myvec[i]
是您要强制转换到的对象的指针,那么它将为该类调用适当的方法;尝试它所花的时间比问问题和得到答案要少。不,这意味着加载我的手机模拟器,我想这可能对其他人有用。尼科尔,你会不会花更少的时间给出一个直截了当的答案?@John:Mobile phone emulator?C++是C++语言;这就是重点。您不必在手机上运行它来测试该语言的基本功能。只需要一个15行的程序就可以测试这一点;尝试它所花的时间比问问题和得到答案要少。不,这意味着加载我的手机模拟器,我想这可能对其他人有用。尼科尔,你会不会花更少的时间给出一个直截了当的答案?@John:Mobile phone emulator?C++是C++语言;这就是重点。您不必在手机上运行它来测试该语言的基本功能。只需要一个15行的程序来测试这个。啊,是的,我的第一次尝试是多么糟糕的一个例子。啊,是的,我的第一次尝试是多么糟糕的一个例子。
printf("%s", (static_cast<Class1*>(myvec[0]))->ToString().c_str());