多继承类中的虚函数

时间:2014-06-06 18:37:37

标签: c++ inheritance multiple-inheritance virtual-functions

首先道歉,如果这是一个新手问题,但我是初学者。 我的问题是我相信钻石问题的一个变种。

想象一下,我有以下课程:

class A{ public: virtual foo();};

class B{ public: foo();};

class C{ public: foo();};

class D: public A, public B, public C{
    public: foo();
};

我的问题是,是否可以从班级foo()拨打D并让虚拟功能在ABC和{{ 1}}。我试过这个,但D函数会覆盖所有其他d::foo()函数。

或者只有你做1:2的继承方案才有可能吗?

foo()

我问的原因是因为我希望能够在不同的类中构建class A{ public: virtual foo();}; class B: public A { public: foo();}; class C: public B { public: foo();}; class D: public C { public: foo();}; AB,而不必每次都构建CAB但保留运行虚拟功能的可能性,而无需针对每个案例CA::foo()B::foo()进行调用。

2 个答案:

答案 0 :(得分:0)

您必须实施课程D::foo,明确调用A::foo()B::foo()C::foo()。没有办法让它在每个父类上自动调用foo()

答案 1 :(得分:0)

这称为功能重载,因此您无法自动执行所需操作。

你必须这样做:

#include <iostream>

class A {
 public:
  virtual void foo() {
    std::cout << "foo of A\n";
  }
};

class B {
 public:
  // virtual keyword is not needed,
  // but it's to write it so that you
  // remind the reader that foo is virtual
  virtual void foo() {
    std::cout << "foo of B\n";
  }
};

class C {
 public:
  virtual void foo() {
    std::cout << "foo of C\n";
  }
};

class D : public A, public B, public C {
 public:
  virtual void foo() {
    A::foo();
    B::foo();
    C::foo();
    std::cout << "foo of D\n";
  }
};

int main()
{
  D d_object;
  d_object.foo();
  return 0;
}

但是,我强烈建议您阅读此answer,因为您可能会收到:

has virtual method..but not virtual constructor

通常警告明智地被视为真正的错误,因为它们通常会暴露逻辑错误。