C++ C+中多重继承菱形问题中的函数重载+;
这只是一个关于多重继承中菱形问题中函数重载应遵循的最佳实践的问题C++ C+中多重继承菱形问题中的函数重载+;,c++,multiple-inheritance,diamond-problem,C++,Multiple Inheritance,Diamond Problem,这只是一个关于多重继承中菱形问题中函数重载应遵循的最佳实践的问题 #include <iostream> using namespace std; class A { public: virtual void print() { cout << "In A" << endl; } }; class B : public virtual A { public: virtual void print()
#include <iostream>
using namespace std;
class A {
public:
virtual void print() {
cout << "In A" << endl;
}
};
class B : public virtual A {
public:
virtual void print() {
A::print();
cout << "In B" << endl;
}
};
class C : public virtual A {
public:
virtual void print() {
A::print();
cout << "In C" << endl;
}
};
class D : public virtual B, public virtual C {
public:
virtual void print() {
B::print();
C::print();
cout << "In D" << endl;
}
};
a.print()代码>
输出:
In A
In A
In B
In A
In C
b.print()代码>
输出:
In A
In A
In B
In A
In C
c.print()代码>
输出:
In A
In A
In B
In A
In C
D类
源自B类
和C类
class D
还需要重载print()
函数,并调用其父类class B
和class C
以及祖辈类class A
的所有打印函数
使用B::print();C::print()在类D的重载print()
函数中的code>:
d.print()代码>
输出:
In A
In B
In A
In C
In D
In A
In B
In C
In D
这是预期的,因为类B
和类C
中重载的print()
函数都调用了A::print()
在类D
中重载print()
函数的最佳做法是什么
d.print()代码>
输出:
In A
In B
In A
In C
In D
In A
In B
In C
In D
如果类class A
,class B
和class C
不能修改。如果不能修改A、B、C类,并且B和C都调用A,那么就无法通过对继承的任何更改来实现A、B、C、D的输出。即使您没有从B和C继承,只是插入B和C并对它们调用print,您仍然会得到一个重复的。如果允许修改类A、B和C,解决方案会是什么?Re:“派生类中重载的函数”-函数没有重载,它被重写。当同一作用域中有同一函数的两个声明时,就会发生重载。当派生类的某个基类中的某个函数的名称和签名与某个函数的名称和签名相同时,就会发生重写。由于不能修改a、B、C类,并且B和C都调用a,因此无法通过对继承的任何更改来实现a、B、C、D的输出。即使您没有从B和C继承,只是插入B和C并对它们调用print,您仍然会得到一个重复的。如果允许修改类A、B和C,解决方案会是什么?Re:“派生类中重载的函数”-函数没有重载,它被重写。当同一作用域中有同一函数的两个声明时,就会发生重载。当派生类的某个函数与其基类中的某个函数具有相同的名称和签名时,就会发生重写。