2015-08-13 16 views
7

Rozważmy klasę bazową, która ma atrybutDifferent inicjalizacji atrybutu klasy bazowej

class Base 
{ 
    protected: 

    AttributeBase * elementPtr; 
    ... 
}; 

oraz klasę pochodną

class Derived : public Base 
{ 
    ... 
}; 

Mam także klasę AttributeDerived która wywodzi się z AttributeBase

Kiedy Tworzę obiekt klasy Base Chciałbym zainicjować elementPtr w ten sposób:

elementPtr = new AttributeBase() 

Ale kiedy utworzyć obiekt klasy Derived Chciałbym elementPtr zostać zainicjowany w ten sposób:

elementPtr = new AttributeDerived() 

Co jest najczystszym sposobem aby to zrobić?

Odpowiedz

5

Można dodać protected konstruktora Base który pozwala klasa pochodna zdać elementPtr używać:

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

potem w swojej klasie pochodnej, zadzwoń do tego konstruktora:

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

Jeśli użyj C++ 11, możesz wtedy zlecić innym konstruktorom Base ochronę w celu ograniczenia duplikowania kodu.

4

Można dodawać różne ctors z Base dla różnych celów:

class Base 
{ 
    protected: 

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

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

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

A potem

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