C++ 多继承顺序和虚函数

标签 c++ inheritance polymorphism

具有相同功能的抽象类的继承顺序重要吗?

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

DE 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 Dclass 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/

相关文章:

c++ - 声明 "const typedef enum"在 C++ 中有效吗?

c++ - 报告对象正在使用堆栈/堆上的多少内存? (广发局)

.net - .NET 中的继承没用?

java - JPA/Hibernate - 多态多对一关系设计

没有纯虚函数的 C++ 抽象类?

当函数采用非平凡参数时,通过 SWIG 使用 python 进行 C++ 回调?

c++ - 外部while循环有什么问题?

java - 在子类中重新定义静态方法

c++ - 如何使用来自不同继承层次级别的多个虚函数指针作为模板参数?

c# - 使用 JsonDerivedType 属性序列化和反序列化 .NET 7 中的多态对象