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
继承自 B
和 A
,你必须使用虚拟继承(从 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;
}
考虑以下代码:
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
继承自 B
和 A
,你必须使用虚拟继承(从 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;
}