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

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

Misha111

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

[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), но ведь он переопределен в В???
НЕ ПОНИМАЮ!!! Подскажите почему не работает.
 

grigsoft

Well-known member
15.11.2005
735
0
#2
В конструкторе нельзя вызывать виртуальные методы. Когда создается объект базового класса, порожденный объект еще не инициализирован, так что VMT содержит только методы текущего типа.
 
M

Misha111

#3
Спасибо.
Как я понял тоже самое произойдет и в деструкторе.
Довольно долго пришлось прг на Delphi. Сейчас перешел на C++.
В Delphi такое проходит и очень удобно использовать.
И на сколько я понял, в конструкторе и диструкторе родителя будут вызываться только его функции.
Механизм virtual на проходит, а жаль.
 
04.09.2006
2 566
3
#6
Смысл этого творения - предоставление классам-наследникам интерфейса инициализации, который необходимо реализовать. Только вот конструкор сам может выполнять такую роль. Кроме того, возможно использование идиомы двухфазного конструктора (т.е. через отдельный метод Initialize)

Вот, кстати, есть ссылка: http://ru.wikipedia.org/wiki/Конструктор_(программирование)
 
Статус
Закрыто для дальнейших ответов.