2016-06-29 30 views
1

Ich implemeting diesen Diamanten Vererbung:Vererbung falscher Aufruf von Konstrukteuren

class Object { 
private: 
    int id; string name; 
public: 
    Object(){}; 
    Object(int i, string n){name = n; id = i;}; 
}; 


class Button: virtual public Object { 
private: 
    string type1; 
    int x_coord, y_coord; 
public: 
    Button():Object(){}; 
    Button(int i, string n, string ty, int x, int y):Object(i, n){ 
      type = ty; 
      x_coord = x; 
      y_coord = y;}; 
}; 


class Action: virtual public Object { 
private: 
    string type2; 
public: 
    Action():Object(){}; 
    Action(int i, string n, string t):Object(i, n){ type2 = t;}; 
}; 


class ActionButton: public Button, public Action{ 
private: 
    bool active; 
public: 
    ActionButton():Buton(), Action(){}; 
    ActionButton(int i, string n, string t1, int x, int y, string t2, bool a): 
    Button(i, n, t1, x, y), Action(i, n, t2) {active = a;}; 
}; 

Alles funktioniert gut über die ersten drei Klassen, aber wenn ich versuche, ein Objekt des Typs ActionButton zu erstellen, anstatt den Konstruktor des Aufrufs Mit den Parametern, die ich geschrieben habe, ruft es den Standard aus der Klasse Object auf. Jedes ButtonAction-Objekt hat also einen leeren String und einen zufälligen Wert. Was ist falsch mit meinem Code und wie kann ich es richtig funktionieren lassen?

+0

Ca Sie zeigen, wie Sie die 'ActionButton's erstellen? – NathanOliver

+0

ActiveButton AB (1, "button", "square", 40, 40, "delete", true); – SuperChit

Antwort

5

Virtuelle Basen werden direkt vom Konstruktor der abgeleiteten Klasse erstellt.

Ihr ActionButton Konstruktor ruft nicht explizit den Konstruktor Object auf, daher wird der Standardkonstruktor für Sie aufgerufen.

+0

So sollte ich diesen Weg nennen: ActionButton (int i, Zeichenkette n, Zeichenkette t1, int x, int y, Zeichenkette t2, bool a): Objekt (i, n), Knopf (i, n, t1, x , y), Aktion (i, n, t2) {aktiv = a;}; ? – SuperChit

+0

@SuperChit Korrigieren. –

+1

Danke, jetzt funktioniert es. Aber kannst du bitte sagen warum heißt es nicht wenn es Action oder Button heißt? Weil das Objekt da ist, habe ich erwartet, dieser Logik zu folgen. – SuperChit