Абстрактный родитель

  • Автор темы Misha111
  • Дата начала
Статус
Закрыто для дальнейших ответов.
M

Misha111

Есть абстрактный класс (с абстрактными функциями) и его ребенок, где переопределены абстрактные функции родителя.
В общем вроде все просто, но при коде:

[codebox]class A
{
public:
A(void)
{
Open();
}
~A(void)
{
Close();
}
void Open(void)
{
internalOpen();
}
void Close(void)
{
internalClose();
}
protected:
virtual void internalOpen(void) = 0;
virtual void internalClose(void) = 0;
};

class B: public A
{
int x;

protected:
virtual void internalOpen(void)
{
x = 1;
}
virtual void internalClose(void)
{
x = 2;
}
};

B b;[/codebox]

ругается - вызов абстратной функции (internalOpen), но ведь он переопределен в В???
НЕ ПОНИМАЮ!!! Подскажите почему не работает.
 
G

grigsoft

В конструкторе нельзя вызывать виртуальные методы. Когда создается объект базового класса, порожденный объект еще не инициализирован, так что VMT содержит только методы текущего типа.
 
M

Misha111

Спасибо.
Как я понял тоже самое произойдет и в деструкторе.
Довольно долго пришлось прг на Delphi. Сейчас перешел на C++.
В Delphi такое проходит и очень удобно использовать.
И на сколько я понял, в конструкторе и диструкторе родителя будут вызываться только его функции.
Механизм virtual на проходит, а жаль.
 
D

destr

Я вообще не понял смысла этого творения.
 
E

European

Смысл этого творения - предоставление классам-наследникам интерфейса инициализации, который необходимо реализовать. Только вот конструкор сам может выполнять такую роль. Кроме того, возможно использование идиомы двухфазного конструктора (т.е. через отдельный метод Initialize)

Вот, кстати, есть ссылка:
 
D

destr

Точно! Что-то я сразу не уловил мысль.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!