【问题标题】:Multiple Inheritance in C++, choose from which class take the memberC++中的多重继承,从哪个类中选择成员
【发布时间】:2021-07-08 15:04:14
【问题描述】:

考虑以下代码:

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;
  }
};

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

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

  \\ Inheritate g from C
};

如何在 C++ 中做到这一点?

【问题讨论】:

  • 为什么class C : public B { ... }; 不能解决您的问题(前提是您将B::f() 标记为覆盖)?
  • 啊,多重继承的乐趣。像这样的问题是其他语言不支持它的原因。可能有更好的方法,但我可能会实现 C::f 来调用我想要的方法。
  • 不需要多重继承,因为继承是传递性的。
  • 我意识到我问错了问题,所以我编辑了它。对不起!
  • @JosephLarson 我在这里看不到“问题”。您在这里有两个不同的基本子对象。我可能不是你想要的,但如果是这样,唯一的问题就是滥用非虚拟继承!

标签: c++ inheritance multiple-inheritance


【解决方案1】:

如果您的 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

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

编辑

由于 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

根据需要。

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

【讨论】:

  • 我意识到我问错了问题,所以我编辑了它。对不起!
  • @L.A.我改变了答案。
  • @我还有一个问题:
【解决方案2】:
#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;
}

【讨论】:

  • 谢谢,但我已经改变了问题
猜你喜欢
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多