Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
konichiwa@rambler.ru
Зарегистрирован: 15.03.2005 Сообщения: 2
|
Добавлено: Вт Мар 15 2005 19:58 Заголовок сообщения: Ну очень глупый вопрос... |
|
|
Здравствуйте, друзья!
Хотел бы задать гуру С++ глупый вопрос.
Имеется сампл кода следующего вида:
class a
{
public:
virtual void f(void)=0;
};
class b: public a
{
// void f(void);
};
void b::f(void)
{
}
Почему он компилируется только если присутствует определение метода в классе-наследнике. Почему нельзя обойтись без него, ведь декларация метода есть в классе-родителе? Какой в этом глубокий смысл? Почему привидённый код не компилируется в привидённом виде, с закоментаренным определением? MSVC выдаёт error C2509: 'f' : member function not declared in 'b'
Заранее спасибо за ответы. |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Вт Мар 15 2005 22:36 Заголовок сообщения: |
|
|
В смысле? Ну так он же определён в родителе как чистый виртуальный метод. |
|
Вернуться к началу |
|
|
konichiwa@rambler.ru
Зарегистрирован: 15.03.2005 Сообщения: 2
|
Добавлено: Вт Мар 15 2005 23:02 Заголовок сообщения: |
|
|
Это понятно. Но почему не может компилироваться такой код:
class a
{
public:
virtual void f(void)=0;
};
class b: public a
{
};
void b::f(void)
{
}
Что, компилятору в таком случае будет неизвестно о каком виртуальном методе идёт речь? |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Ср Мар 16 2005 21:42 Заголовок сообщения: |
|
|
В более ранних реализациях C++ (стандарт AT&T 2.0) вообще запрещалось наследование чистой виртуальной функции.
Сейчас, насколько я знаю, виртуальная должна быть переобъявлена в порождённом классе либо как виртуальная, либо как обычная. |
|
Вернуться к началу |
|
|
|