【问题标题】:Why won't dynamic binding work without the use of the "virtual" keyword? [duplicate]为什么不使用“virtual”关键字就不能动态绑定? [复制]
【发布时间】:2018-11-14 06:47:26
【问题描述】:

假设我有两节课

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 关键字(在我的情况下,一个好的情况是在析构函数中)。但是为什么我需要这个虚拟关键字才能拥有这种真正的多态性呢?如果我试图调用一个显示函数,我理解它,编译器/在运行时发生的任何事情都需要弄清楚要调用哪个显示。但我不确定为什么这里需要它。我想要一个解释。

谢谢

【问题讨论】:

  • 我怀疑你想要另一个答案,而不是“因为语言是这样设计的”?
  • 如何编写一个动态绑定的函数?需要有一种方法来区分多态函数和沼泽标准、普通函数、永远不会被覆盖的普通函数。
  • 哈,如果可以的话。通常语言都是以特定的方式设计的,对吧?一定是有原因的:P

标签: c++ polymorphism


【解决方案1】:

围绕 C++ 的设计原理是您无需为不用的东西付费。

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

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

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

【讨论】:

  • 标准中没有要求多态类包含有关对象类型(或虚函数表或其他任何内容)的附加信息。您所描述的是编译器通常如何支持多态性 - 但这是因为它在多个方面都是一个很好的实际实现选择,而不是因为它是标准所要求的,也不是因为标准禁止替代实现方法。
猜你喜欢
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多