2013-06-13 2 views
0

Мне сложно понять, почему переменная engineNum недоступна из функции в классе Pickup. Мое основное понимание заключается в том, что если класс наследуется, частные переменные должны быть доступны. Это не так, я нахожу:Переменная недоступна, несмотря на наследование класса?

class Truck 
{ 
private: 
    string model; 
    Truck() {}; 
    static int TruckEngineNum; 
    int engineNum; 
public: 
    Truck(const string& model) 
    { 
     this->model = model; 
     engineNum = TruckEngineNum++; 
    }; 

    string getModel() 
    { 
     return model; 
    } 
    int getEngineNum() 
    { 
     return engineNum; 
    } 
}; 
int Truck::TruckEngineNum = 100; 

class Pickup : public Truck 
{ 
public: 
    Pickup(const string& model) : Truck(model) 
    { 
     if((engineNum % 2) == 1){ engineNum++; }; 
    } 
}; 
+0

http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance-in-c – yuan

+0

@yuan right! Теперь это имеет смысл. Спасибо! – Switchkick

ответ

4

private переменные не доступны в производных классах. Если вы хотите получить к нему доступ, вам нужно объявить его как protected.

Кроме того, ваш класс Truck должен объявить деструктор virutal, если вы планируете использовать его в качестве полиморфного базового класса.

+0

Верьте или нет, это была моя первая мысль, и я изменил код, чтобы отразить это. Плохо ли использовать практику (в любом случае) защищенную, а не частную? – Switchkick

+0

Всё зависит. Эмпирическое правило делает все частным, если вы абсолютно не можете. Если вам определенно нужен доступ к этой переменной в производном классе, тогда сделайте ее защищенной - просто поймите, что она будет сочетать классы вместе больше, поэтому некоторые изменения в базовом классе будут сложнее сделать. – Yuushi

+3

Обычно вы хотите, чтобы переменные-члены были приватными во всех случаях, даже если вам нужен доступ к производным классам. Если вы убедитесь, что у вас есть, например, публичный получатель и защищенный сеттер, который позволяет производным классам изменять данные, но все же позволяет базовому классу обеспечивать гарантии относительно его внутреннего состояния. Если вы защищаете данные, то ваши производные классы могут делать с ними все, что захотят, даже если это нарушает поведение базового класса. – Cogwheel

Смежные вопросы