c++ - 为什么不使用 "virtual"关键字动态绑定(bind)就不能工作?

标签 c++ polymorphism

<分区>

假设我有两个类

class Bar{
    public:
    Bar()
    ~Bar()
}
class Foo:public Bar{
    Foo()
    ~Foo
}

现在,如果我想执行以下操作:

int main(){
     Bar * obj = new Foo();
     Foo * obj2 = dynamic_cast<Foo*>(obj);
     return 0;
}

我得到一个错误,我不能动态转换它,因为它不是多态的。我知道这是因为我的基类中的任何地方都没有 virtual 关键字(在我的情况下,最好的情况是在析构函数中)。但是为什么我需要这个虚拟关键字来实现这种真正的多态性呢?我理解如果我试图调用一个显示函数,编译器/运行时发生的任何事情都需要确定要调用哪个显示。但我不确定为什么这里需要它。我想要一个解释。

谢谢

最佳答案

C++ 的设计原理是您无需为未使用的内容付费。

dynamic_cast 实际上要求类是多态的。我相信这个概念存在于标准中。

当类是多态的时,该类的每个对象实际上都包含有关对象类型的附加信息(直接或间接)。这会增加对象的大小。编译器不会自动插入此信息,而是仅在您将成员设为虚拟时才会插入。

查看此问题的答案:C++: Why does a struct\class need a virtual method in order to be polymorphic?

关于c++ - 为什么不使用 "virtual"关键字动态绑定(bind)就不能工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53294531/

相关文章:

php - PHP中看似多态的东西真的是多态吗?

c++ - 从模板基类继承构造函数而不重复模板参数?

c++ - 将数据从 vector 推回到 map 的 vector

c++ - C++20 模板ambas 的限制和使用

c++ - 为什么我的模板参数包不起作用?

templates - 为什么这些模板函数的行为不像虚函数?

C++在多个对象实例之间共享一个变量

c++ - 数组内存分配不起作用

c# - 具有序列化类的层次结构中的多态性 - DataContract 消息

python - 比较两个类列表对象的内容的最佳方法是什么?