c++多态性,不完全向下转换

C++ Polymorphism, incomplete downcasting

本文关键字:转换 不完全 多态性 c++      更新时间:2023-10-16

我有一个数组,其中包含对平淡基类型的引用,我们称其为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的虚函数,因为对象是该类型的。

请记住:虚函数的目的是调用实际的类的函数,而不是指针/引用当前看起来是类的函数。

当我第一次回答你的问题时,我有点误解了你的问题,关于恶魔和你的鼻孔。

virtual关键字将达到预期的效果。也就是说,你会看到2。虽然您已经转换为Class1,但虚函数表将发挥它的魔力。

首先,这不是一个安全的强制转换。但是假设myvec[i]是一个指针,您要转换到的对象,那么它将为该类调用适当的方法。