C++中的多重继承,选择class取成员

Multiple Inheritance in C++, choose from which class take the member

考虑以下代码:

class A {
  public:
  virtual void f() {
    std::cout << "A-F" << std::endl;
  }

  virtual void g() {
    std::cout << "A-G" << std::endl;
  }
};

class B: public A {
  public:
  void f() {
    std::cout << "B-F" << std::endl;
  }
};

class C: public A {
  public:
  void g() {
    std::cout << "C-G" << std::endl;
  }
};

现在我想定义一个class C,其成员f是class B,成员g来自class A。像这样:

class D: public B, public C {
  public:
  \ Inheritate f from B

  \ Inheritate g from C
};

如何使用 C++ 实现?

如果您的 C 仅继承自 B,即 class C: public B {/*...*/},您也可以实现同样的效果。如果你真的想让你的 C 继承自 BA,你必须使用虚拟继承(从 A 继承时请参阅 virtual 关键字):

#include <iostream>

class A {
  public:
  virtual void f() {
    std::cout << "A-F" << std::endl;
  }

  void g() {
    std::cout << "A-G" << std::endl;
  }
};

class B: virtual public A {
  public:
  void f() override {
    std::cout << "B-F" << std::endl;
  }
};

class C: virtual public A, public B {
  public:
};


int main() {

    C c;
    c.f();
    c.g();

    return 0;
}

这会打印

B-F
A-G

无关:我建议使用 override(或 final)关键字,尤其是在处理更复杂的 class 层次结构时。

编辑

由于 OP 更改了问题:

#include <iostream>

class A {
  public:
  virtual void f() {
    std::cout << "A-F" << std::endl;
  }

  virtual void g() {
    std::cout << "A-G" << std::endl;
  }
};

class B: virtual public A {
  public:
  void f() override {
    std::cout << "B-F" << std::endl;
  }
};

class C: virtual public A {
  public:
  void g() override {
    std::cout << "C-G" << std::endl;
  }
};

class D: public B, public C {
  public:
  // Inherits f from B
  // Inherits g from C
};


int main() {

    D d;
    d.f();
    d.g();

    return 0;
}

这会打印:

B-F
C-G

根据需要。

注意 我不是虚拟继承的忠实拥护者,也许有更好的解决方案来解决您的问题。但是,这取决于您的具体问题。

#include <iostream>

using namespace std;

class A {
  public:
  virtual void f() {
    std::cout << "A-F" << std::endl;
  }

  void g() {
    std::cout << "A-G" << std::endl;
  }
};

class B: public A {
  public:
  void f() {
    std::cout << "B-F" << std::endl;
  }
};

class C: public B{
  
};

int main()
{
   C c;
   c.f();
   c.g();
   return 0;
}