2013-01-23 25 views
5

Eventuali duplicati:
Default constructor and virtual inheritanceeredità virtuale e costruttori parametrizzati

class Base 
{ 
private: 
    int number; 
protected: 
    Base(int n) : number(n) {} 
public: 
    virtual void write() {cout << number;}  
}; 

class Derived1 : virtual public Base 
{ 
private: 
    int number; 
protected: 
    Derived1(int n, int n2) : Base(n), number(n2) {} 
public: 
    virtual void write() {Base::write(); cout << number;} 
}; 

class Derived2 : virtual public Base 
{ 
private: 
    int number; 
protected: 
    Derived2(int n, int n2) : Base(n), number(n2) {} 
public: 
    virtual void write() {Base::write(); cout << number;} 
}; 

class Problematic : public Derived1, public Derived2 
{ 
private: 
    int number; 
public: 
    Problematic(int n, int n2, int n3, int n4) : Derived1(n, n2), Derived2(n, n3), number(n4) {} 
    virtual void write() {Derived1::write(); Derived2::write(); cout << number;} 
}; 

int main() 
{ 
    Base* obj = new Problematic(1, 2, 3, 4); 
    obj->write(); 
} 

In altre parole:

Base 
| \ 
| \ 
| \ 
| \ 
D1 D2 
| /
| /
|/
|/
Problematic 

Sto cercando di ottenere "1 2 1 3 4 "sull'uscita. Il compilatore, tuttavia, continua a lamentarsi del fatto che ho bisogno di un costruttore senza parametri in Base, ma quando ne aggiungo uno, il "1" diventa spazzatura. Qualche idea su come affrontarlo? È persino possibile risolvere il rombo con un costruttore parametrizzato?

+1

Ti manca; s 'sulle classi derivate – cppguy

+0

@cppguy - io non lo vedo, ma non è il vero e proprio codice in ogni caso (probabilmente solo un errore di battitura). –

+0

@MaciejStachowski ildjarn l'ha aggiunto per voi –

risposta

2

Dai uno sguardo a Calling a virtual base class's overloaded constructor, sembra che se l'ereditarietà è virtuale, la classe più derivata deve chiamare il costruttore della classe base.

Problematic(int n, int n2, int n3, int n4) : Derived1(n, n2), Derived2(n, n3), Base(n), number(n4) {} 
+0

Quindi, questo significa che tutte le classi che ereditano da Derived1/2 o da una qualsiasi delle loro sottoclassi devono chiamare il costruttore Base? Il mio amore per il C++ si è appena ridotto un po '. –