C++ 多态性,不完全向下转型

标签 c++ polymorphism virtual-functions static-cast

我有一个数组,其中包含对平淡基本类型的引用,我们称它为 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/

相关文章:

c++ - 为什么在选择排序中使用 Xor 运算符交换对象不起作用?

Linq 对不同类型的列表进行排序

Java设计: Adding common functionality to classes that extend the same base class,,不修改基类

c# - 如何使用虚方法显式实现接口(interface)?

c++ - 虚函数表指针的大小是多少?

c++ - vfprintf_unlocked() 等效吗?

c++ - 使用 valgrind massif 测量 C++ 应用程序最大内存使用量(堆栈和堆)

c++ - 为什么在链接到 zlib.lib 时出现错误 LNK2001?

c++ - C++ 中的组件/策略模式、设计和实现

c++ - 使用带有类和构造函数的虚函数来打印书籍信息