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());