具有相同功能的抽象类的继承顺序重要吗?
class A {
public:
virtual void f1() = 0;
virtual void f2() = 0;
};
class B : public A {
public:
virtual void f1() { globalF1_B(); }
virtual void f2() { globalF2_B(); }
};
class C : public A {
public:
virtual void f1() { globalF1_C(); }
};
class D : public A, public B, public C { };
class E : public A, public C, public B { };
D
和 E
classes 是否相同,如果我这样写:
class D{
public:
virtual void f1() { globalF1_C(); }
virtual void f2() { globalF2_B(); }
};
class E {
public:
virtual void f1() { globalF1_B(); }
virtual void f2() { globalF2_B(); }
};
附言。我将 class A
继承到 class D
和 class E
以防万一我忘记实现类 A 的功能。
最佳答案
不,不一样。除了提供的无效 C++ 代码外,我们还可以说:
在第一种情况下,您的类 D 和 E 有两个方法 f1()
(一个继承自 B,一个继承自 C)和一个方法 f2()
(继承自 C)。如果您能够构造一个 D 对象名称 d,那么 d.f1()
将被报告为一个歧义,您需要以这种方式澄清:d.B::f1( )
或这个 d.C::f1()
。
而在第二种情况下,您的类将只有两个方法 f1()
和 f2()
。
#include <iostream>
using namespace std;
class A {
public:
virtual void f1() = 0;
virtual void f2() = 0;
};
class B : public A {
public:
virtual void f1() { cout << "B::f1()" << endl; }
virtual void f2() { cout << "B::f2()" << endl; }
};
class C : public A {
public:
virtual void f1() { cout << "C::f1()" << endl; }
virtual void f2() { cout << "C::f2()" << endl; }
};
class D : public B, public C { };
class E : public C, public B { };
int main() {
D d;
// d.f1(); // t.cpp:28:5: error: member 'f1' found in multiple base classes of different types
d.C::f1();
d.B::f1();
}
关于C++ 多继承顺序和虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33349333/