class CA
{
public:
CA(HWND){};
};
class CB : public CA
{
public:
CB(HWND)
{
CA::CA ((HWND)0);// Этой строки может и не быть
};
};
В результате ошибка компиллятора: error C2512: 'CA' : no appropriate default constructor available
Ошибка пропадает, если использовать конструкторы без параметров (или только СА без параметров). Как правильно переопределить конструкторы с параметрами?
Здравствуйте, SVV, Вы писали:
SVV>Привет, всем.
SVV>Есть такой код: SVV>
SVV>class CA
SVV>{
SVV>public:
SVV> CA(HWND){};
SVV>};
SVV>class CB : public CA
SVV>{
SVV>public:
SVV> CB(HWND):CA ((HWND)0);// А такую неплохо бы и добавить
SVV> {
SVV>// CA::CA ((HWND)0);// Этой строки может и не быть и не надо
SVV> };
SVV>};
SVV>
При создании производного класса вызывается конструктор производного класса , если не указан явно, то берется конструктор по умолчанию, иначе нужно явно указывать какой конструктор вызывать
class A{
A()
{
}
};
class B()
{
B() : A() // можно A() не указывать явно
{}
}
SVV>В результате ошибка компиллятора: error C2512: 'CA' : no appropriate default constructor available SVV>Ошибка пропадает, если использовать конструкторы без параметров (или только СА без параметров). Как правильно переопределить конструкторы с параметрами?
Здравствуйте, SVV, Вы писали:
SVV>Спасибо. SVV>Компиллятор уже поборол. Сейчас буду выяснять правильно ли это работает.
Борьба с компилятором до добра не доведет
С компилятором надо по-хорошему...
B>Борьба с компилятором до добра не доведет
Согласен. B>С компилятором надо по-хорошему...
А двоеточие означает что конструктор СВ наследует код CA, или всего лишь определяет какой базовый конструктор вызывать, если явного вызова не будет?
Здравствуйте, SVV, Вы писали:
...
SVV>А двоеточие означает что конструктор СВ наследует код CA
ни в коем случае (см. ниже)
SVV>... или всего лишь определяет какой базовый конструктор вызывать
После двоеточя идет так называемый список инициализации. В этом списке в том числе можно указывать какой именно конструктор базового класса нужно вызвать
SVV> ...если явного вызова не будет?
Если явного вызова не будет, то компилятор попробует вызвать констуктор по умолчанию. В случае отсутствия констуктора по умолчанию возникнет ошибка (в чем ты уже убедился)
ЗЫ
констуктор по умолчанию — это констркутор без параметров, или с параметрами, имеющими значения по умолчанию.
class CA
{
public:
CA(HWND h){};
};
class CB : public CA
{
public:
CB(HWND h)
{
CA::CA ((HWND)0);// Этой строки может и не быть
};
};
...
void main()
{
CB bl;
}
SVV>В результате ошибка компиллятора: error C2512: 'CA' : no appropriate default constructor available SVV>Ошибка пропадает, если использовать конструкторы без параметров (или только СА без параметров). SVV>Как правильно переопределить конструкторы с параметрами?
Когда ты создаешь объект у которого есть базовые классы — то сначала вызываются конструкторы для базовых классов, а потом конструктор для самого объекта.
То что ты вызываешь конструктор для СА внутри CB ничего не значит для компилятора.
И вообще
CA::CA ((HWND)0);
— это ты просто создал временный объект CA, который будет уничтожен после выхода из конструктора.
Компилятор сам пытается вызвать конструктор по умолчанию для СА. А такого просто нет — вот он и ругается.
Нужно писать вот так:
CB():CA()
{
...
}
Этим ты говоришь, что перед выполнением конструктора CB нужно выполнить конструктор CA.