[英]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
繼承自B
和A
,則必須使用 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.