C++虚拟定义是否自动继承?

Is C++ virtual definition inherited automatically?

C++虚定义是递归的吗?考虑

class Foo
     {
     public:
          virtual void a()=0;
     };

class Bar:public Foo
     {
     public:
         void a()
             {
         //...
             }
     };

如果我现在继承Bar并再次重载a,那a是不是也是多态的?

递归意味着

Given a class A that has a virtual member a, and a virtual member of the n:th subclass of A, then a is also a virtual member of the n+1:th subclass, for all n.

即虚函数遵循Peanos归纳公理,一级后不终止。

如果您继承自 Bar,您应该

class Bar:public Foo
     {
     public:
         virtual void a() override
             {
         //...
             }
     };

所以你在这里说了关于 a() 的两件事:

  1. 该函数是虚函数,因此任何派生自 Bar 的函数都会将该函数视为虚函数
  2. 您正在从基础 class Foo
  3. 覆盖函数 a

and 所述,Bar 中的 virtual 关键字是多余的,因为该函数将被视为 virtual,因为它位于基础 class.但是,我倾向于使用 virtual/override 的习惯,如我的示例所示,因此乍一看 class 就可以立即清楚如何使用此函数,而无需必须继承遗产。

"Recursive" 这个词不对;但是,是的,覆盖虚函数的函数本身就是虚函数。

具有 (i) 相同名称,(ii) 相同参数类型,以及 (iii) 基类和子类中的 相关 return 类型的任何函数在基础 class 中标记为 virtual 的 class 在子 class 中也将是虚拟的。

所以是的,void bar::a() 也是虚拟的。事实上,没有办法删除子 class 函数中的 virtual-ness。

您的条款不准确。 重载 与具有相同名称但不同参数类型的函数有关。 递归 是一种控制流技术。 覆盖 是在子 class.

中重新实现基础 class 函数

在正常情况下,重写的虚函数本身就是虚函数。父 class 函数是虚拟的并不重要,因为您使用了 virtual 关键字,或者因为它自己的父函数是虚拟的。

需要注意的一件事是,当您 "hide" 一个函数与另一个同名但签名不同的函数时。该函数不是虚拟的!

class Foo
     {
     public:
          virtual void a()=0;
     };

class Bar:public Foo
     {
     public:
         void a(); // virtual
     };

class Baz1 : public Bar
     {
     public:
         void a(); // also virtual
     };

class Baz2 : public Bar
     {
     public:
         void a(int); // not virtual!
     };