2015-08-13 17 views
7

consideri una classe base che ha un attributodifferente inizializzazione dell'attributo classe base

class Base 
{ 
    protected: 

    AttributeBase * elementPtr; 
    ... 
}; 

E una classe derivata

class Derived : public Base 
{ 
    ... 
}; 

Inoltre ho una classe AttributeDerived che deriva da AttributeBase

Quando Creo un oggetto della classe Base Vorrei che lo elementPtr venga inizializzato in questo modo:

elementPtr = new AttributeBase() 

Ma quando creo un oggetto della classe Derived vorrei elementPtr da inizializzare in questo modo:

elementPtr = new AttributeDerived() 

Qual è il modo più pulito per farlo?

risposta

5

Si potrebbe aggiungere un costruttore protected-Base che consente alla classe derivata per passare un elementPtr da usare:

Base (AttributeBase* elementPtr) : elementPtr(elementPtr) 
{} 

Poi nella classe derivata, chiamare quel costruttore:

Derived() : Base(new AttributeDerived()) 
{} 

Se utilizzare C++ 11, è quindi possibile delegare altri costruttori Base a quello protetto per limitare la duplicazione del codice.

4

Si potrebbe aggiungere diversi ctors di Base per scopi diversi:

class Base 
{ 
    protected: 

    AttributeBase * elementPtr; 
    Base(AttributeBase * p) : elementPtr(p) {} 

    public: 
    Base() : elementPtr(new AttributeBase) {} 
}; 

class Derived : public Base 
{ 
    public: 
    Derived() : Base(new AttributeDerived) {} 
}; 

E poi

Base b; // elementPtr = new AttributeBase() 
Derived d; // elementPtr = new AttributeDerived() 
Problemi correlati