2016-09-17 1 views
-3

Ich habe dieses Problem, das ich nicht weiß, wie man richtig löst.C++ - OOP-Design - Mehrfachvererbung und reine virtuelle Methode

class A : public B, public C 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

class B 
{ 
    public void GetSomething() 
    {  
     GetSomethingElse(); 
    } 

    virtual void GetSomethingElse() = 0; 
} 

class C 
{ 
    virtual void GetSomethingElse() = 0; 
} 

Im Grunde, was ich habe, sind zwei abstrakte Klassen B, C. Normalerweise muss ich nur einen von ihnen erben, aber in einigen besonderen Fällen brauche ich beide.

So lösen Sie dieses Problem mit GetSomethingElse() Methode, die von B aufgerufen werden muss. Wenn ich nur B erben, wird es in Kind implementiert werden. Wenn nur von C, ist alles noch in Ordnung. Allerdings, wenn ich erben B und C, habe ich einige "seltsame" Design, das Diamond Vererbungs Problem resemlbes, aber es ist ziemlich nicht das Gleiche.

+2

Ich sehe kein Problem von B und C. Welches Problem haben Sie genau? –

+0

Können Sie Code bereitstellen, der den Fehler erzeugt, den Sie lösen möchten? – Galik

Antwort

2

Wie Sie bereits erwähnt, ist es ganz anders als Diamant Problem.

Ihr Design ist korrekt und nicht verwaart. Wenn GetSomeThingElse als reines virtuelles Objekt verwendet wird, muss das untergeordnete Objekt erzwungen werden, um es zu definieren. Es zu definieren, wenn es wegen C oder B ist, ist kein Design-Problem. Sie hätten ein Design-Problem, wenn es rein virtuell in einem und virtuell in dem anderen (B oder C) wäre, da Sie die Wahl und die andere durch die Verpflichtung erhalten.

-1

Da sie abstrakt sind, müssen Sie die Methode in class A überschreiben. Jedes Objekt wird wissen, ob es ein B oder ein C ist, so wird es die richtige Funktion aufrufen.

Wenn Ihre Klasse C jedoch keine Funktion GetSomething() hat, dann ist Ihre Vererbungsstruktur falsch - erinnern Sie sich an die Logik der Vererbung, dass jedes Objekt einer abgeleiteten Klasse auch ein Objekt der Elternklasse ist? Wenn also ein A kein B ist, weil es keinen solchen Anruf hat, stimmt etwas nicht.

Ein weiterer Punkt ist virtual abzuleiten, so die beiden identischen Funktionen sind die gleichen betrachtet: class A : virtual public B, virtual public C

fanden Sie eine Klasse zu machen, dass die Eltern von B und C? Wenn sie kein gemeinsames Elternteil haben, warum haben sie dann eine Funktion mit dem gleichen Namen?

0
class A : public B, public C 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

class B:public class D 
{ 
    public void GetSomething() 
    {  
     GetSomethingElse(); 
    } 

    virtual void GetSomethingElse() 
    { 
    } 
} 

class C:public class D 
{ 
    virtual void GetSomethingElse() 
    { 
    } 
} 

//here's the only pure virtual base class 
class D 
{ 
    virtual void GetSomethingElse() = 0; 
} 
Verwandte Themen