2013-04-12 2 views
4

Я немного запутался в полях класса и суперкласса. Я ожидал, что все будет хорошо:C++: обмен полями между классом и суперклассами

class SuperC { 
public: 
    SuperC(); 
protected: 
    double value; 
}; 

class C : public SuperC { 
public : 
    C(double value); 
}; 

SuperC::SuperC(){} 
C::C(double value):SuperC(),value(value){} 

но компилятор говорит мне, что у C нет поля «значение». C не наследует от того, что определено в SuperC?

многий ТНХ

+0

Какой компилятор это? g ++ (gcc 4.7.2) не имеет жалоб (называется g ++ file.cpp) –

+0

mingw32-g ++. exe ... Я тоже смущен, потому что я уверен, что делаю что-то вроде выше, используя мою систему (кодовые блоки на windows8), и я с удивлением вижу, что это не компиляция. Что-то мне не хватает. – Vince

+0

Хех, мое плохое вставке Я как-то потерял определения конструктора. Дурак я. –

ответ

8

Он делает, но вы можете инициализировать только нынешние член класса с использованием синтаксиса конструктора списка инициализации.

Вам необходимо создать перегруженный конструктор в SuperC, который инициализирует value и называет это.

class SuperC { 
public: 
    SuperC(); 
    SuperC(double v) : value(v) {} 
protected: 
    double value; 
}; 

class C : public SuperC { 
public : 
    C(double value); 
}; 

SuperC::SuperC(){} 
C::C(double value):SuperC(value){} 
+0

Я предполагаю, что каждый класс отвечает за инициализацию своих собственных членов, даже в сценариях наследования, но я не уверен, что понимаю, почему это поведение требуется. Вы не знаете, где это указано в стандарте? –

+0

@MihaiTodor сначала инициализируется базовый класс, поэтому разговор об инициализации одного из его элементов после (во время фактической инициализации SuperC) не имеет смысла. ИМО это хороший звонок, я могу думать о некоторых ошибках из-за ошибочных аргументов и еще чего-то. –

+0

О, стреляй, да, ты прав. Спасибо что подметил это! :) –

1

Вы не можете инициализировать элементы базового класса в списке инициализации конструктора производного класса.

fix1: Максимально Вы можете инициализировать конструктор базового класса (BC) в производном классе, передав параметрический код BC.

fix2: Назначение членов базового класса в теле конструктора производного класса, вместо списка инициализации конструктора

C::C(double value1):SuperC() 
{ 
     value = value1; 
} 
+0

@ LuchianGrigore извините. Его назначение. – shivakumar

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