簡體   English   中英

C++中的多個Inheritance,從中選擇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 來自 ZA2F2ED4F8EBC2CBB4A21 之類的東西。

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

  \\ Inheritate g from C
};

如何在 c++ 中做到這一點?

如果您的C僅從B繼承,您可以實現相同的效果,即class C: public B {/*...*/} 如果您真的希望您的C繼承自BA ,則必須使用 virtual inheritance (從 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 )關鍵字,尤其是在處理更復雜的 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

按要求。

請注意,我不是虛擬 inheritance 的忠實粉絲,也許有更好的解決方案來解決您的問題。 但是,這取決於您的確切問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM