【问题标题】:What is consequence of parent class having virtual method but derived class has no virtual method?父类有虚方法但派生类没有虚方法的后果是什么?
【发布时间】:2015-08-24 02:36:53
【问题描述】:

注意:我不是在问为什么父类需要有虚方法。

我记得类似这样的编码准则(我不太记得,只是尝试用我自己的话来表达,希望我的措辞正确):如果父类有虚方法,派生类至少也应该有一个虚方法,即使是派生类也不会从自身派生出类,如果派生类真的不需要任何虚方法,则将析构函数设置为虚。背后的原因类似于“防止重复虚拟表”,它在说什么?

我还记得一个相关的例子:

class A{
    virtual f();
};

class B : public A{
};

B作为没有派生类,如果B没有虚方法,后果是“任何包含B的地方都会有一个由编译器生成的重复虚表”(也只是根据我的印象表达),什么是这是什么意思(如果是真的)?

【问题讨论】:

  • 就好像它是由未定义的 AFAIK 声明的一样,也就是说,在您尝试在某处调用它之前不会出现编译器错误。
  • 你必须做得比“类似的东西”和一大堆华夫饼做得更好。您要求我们对您无法准确引用或引用的错误记忆的编码标准发表评论。这是毫无意义。陈述的原因“任何包含 B 的地方都会有一个由编译器生成的重复虚拟表”完全是废话。每个类最多只有一个 vtable。

标签: c++ inheritance coding-style


【解决方案1】:

注意以下几点:

  • 如果基类具有除析构函数之外的虚成员函数,则派生类会继承该函数。
  • 如果基类将成员函数声明为虚拟,而派生类声明具有相同参数类型的同名成员函数,则派生类函数自动为虚拟,并覆盖基类的函数。李>
  • 如果基类具有虚拟析构函数,则派生类的析构函数自动为虚拟,无论用户是否声明,并覆盖基类的析构函数。

你给出的例子没有任何问题。我建议你忘记你认为你记得的关于这个编码标准的一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多