2017-07-26 8 views
-3

ich folgende Testprogramm habenWie löst man das Problem mit Diamanten in C++?

#include<iostream> 
using namespace std; 


class Faculty { 
// data members of Faculty 
public: 
    Faculty(int x) { 
    cout<<"Faculty::Faculty(int) called"<< endl; 
    } 
    void test() { 
     cout<<"Faculty::test called" << endl; 
    } 
}; 

class Student { 
// data members of Student 
public: 
    Student(int x) { 
     cout<<"Student::Student(int) called"<< endl; 
    } 
    void test() { 
     cout<<"Student::test called" << endl; 
    } 
}; 

class TA : virtual public Faculty, virtual public Student { 
public: 
    TA(int x):Student(x), Faculty(x) { 
     cout<<"TA::TA(int) called"<< endl; 
    } 
}; 

int main() { 
    TA ta1(30); 
    ta1.test(); 
} 

aN Fehler während der Kompilierung bekommen

8be257447d8c26ef785b1a60f2884a.cpp: In function 'int main()': 
748be257447d8c26ef785b1a60f2884a.cpp:36:6: error: request for member 'test' is ambiguous 
    ta1.test(); 
    ^
748be257447d8c26ef785b1a60f2884a.cpp:22:7: note: candidates are: void Student::test() 
    void test() { 
    ^
748be257447d8c26ef785b1a60f2884a.cpp:11:7: note:     void Faculty::test() 
    void test() { 
    ^

Auch virtuelle Vererbung hier verwende ich. Irgendeine Lösung dafür?

+11

Hier ist kein Diamant. Sie haben nur einen Namenskonflikt von zwei nicht verwandten Basisklassen, und virtuelle Vererbung kann nichts dagegen tun. Werfen Sie Lösungen, die Sie nicht verstehen, nicht auf andere Probleme. –

+0

irgendeine Lösung auf diesem? – BSalunke

+2

Versuchen Sie 'ta1.Student :: test()' oder 'ta1.Faculty :: test()' – GAVD

Antwort

2

Hier ist kein Schlüsselwort virtual erforderlich, die Klassen Student und Faculty sind nicht über Vererbung aus der gemeinsamen Klasse miteinander verknüpft.

Wenn Sie möchten, dass eine bestimmte Methode in TA verwendet wird, können Sie using Student::test; oder using Faculty::test; innerhalb TA Klasse Deklaration setzen.

Ich hoffe, dass dieses Beispiel aus rein pädagogischen Zwecken erschien, denn wenn es verwendet wird/geplant in realer Anwendung verwendet werden - es ist ein Zeichen für etwas falsch lief mit Design :)

0

Sie haben einfach zwei test() Methoden in Ihre TA Klasse, eine geerbt von Faculty, die andere von Student, und der Compiler informiert Sie richtig, es kann nicht entscheiden, welche Sie anrufen möchten.

Sie müssen, dass lösen entweder explizit zu sagen, welche Methode Sie aufrufen möchten:

TA ta1(30); 
ta1.Faculty::test(); 

oder wie das Objekt behandelt werden sollte (und das wird bedeuten, welche Methode zu nennen):

((Faculty &)ta1).test(); 
Verwandte Themen