2015-10-26 3 views
1

Важно ли, в каком порядке вы наследовали классы abstact, который имеет те же функции?C++ множественный порядок наследования и виртуальные функции

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классов бы то же самое, если бы я написать его, как показано ниже:

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. Я Наследование классA в классD и классаE только в случае, если я могу забыть сделать некоторую реализацию класса функций в.

ответ

1

Нет, не существует. Помимо недопустимого кода 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(); 
} 
+0

Но если все функции виртуальны, не загружали ли последние реализации функций? И каков результат, если я вызываю D.f1(); D.f2(); E.f1(); или E.f2(); (затем написано, как в первом фрагменте кода)? Последний вопрос: Важен ли порядок наследования? – Vinigas

+0

Кажется, что вы ошибаетесь с наследованием ... Если у вас есть класс A с методом f, и вы выводите его в класс B с перегрузкой f, это означает, что в классе B вы должны использовать методы f, а не один. . В вашем классе B у вас есть f1, в C у вас есть f1, а в D у вас есть оба. Я могу предложить вам прочитать хорошую книгу о наследовании на C++. –

+0

Но все эти функции являются ** виртуальными **, а _class_ 'A' даже не имеют реализации' f'. Вы уверены, что правы? – Vinigas

0

НЕТ, первая версия D & E также не будет скомпилирована. возникла бы двусмысленность в разрешении f1 и f2 в D и E