c ++多重继承顺序和虚函数

时间:2015-10-26 15:19:34

标签: c++ inheritance polymorphism

重要的是你继承了 abstact classes 的顺序,它具有相同的功能吗?

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 是否相同,如果我按如下所示编写:

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(); }   
};

PS。我将 class A继承到 class D class E,以防我忘记制作一些A类功能的实现。

2 个答案:

答案 0 :(得分:1)

不,不一样。除了提供的无效C ++代码之外,我们可以说:

在第一种情况下,您的类D和E有两个方法f1()(一个继承自B,一个继承自C)和一个方法f2()(继承自C)。如果您能够构建D对象名称d,那么d.f1()将被报告为歧义,您需要以这种方式澄清:d.B::f1()或此d.C::f1()。< / p>

在第二种情况下,您的课程只有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();
}

答案 1 :(得分:0)

不,第一版D&amp; E也不会编译。在D和E

中解析f1和f2会有歧义