Я использую CodeBlocks, и у меня есть следующий код, который не компилируется.Виртуальная функция C++ не распознана
(Речь идет о ловушках некоторых C++, так что единственное, что я хочу спросить, почему он не компилируется)
Код выглядит следующим образом:
#include <iostream>
using namespace std;
class Shape
{
public:
Shape();
virtual void reset();
private:
int color;
};
class Point : public Shape
{
private:
double a,b;
};
void Shape::reset()
{
cout<<"Shape reset\n";
}
void Point::reset()
{
Shape::reset();
cout<<"Point reset";
}
Shape::Shape()
{
reset();
}
int main()
{
Shape s;
Point o;
}
Я получаю следующее сообщение об ошибке:
no `void Point::reset()' member function declared in class `Point'
О, спасибо. Хотя это работает напрямую, расширяя Point from Shape, но теперь я вижу, что это не так. – delegat
@delegat - Основная причина * почему * вам нужно объявить переопределения - это оптимизация вызовов. Компилятор часто знает точный тип объекта, и в этом случае он оптимизирует доступ VMT (вызывает метод напрямую, а не виртуально). Но если реализация «Point :: reset» была видна только в своем модуле компиляции, это привело бы к ошибочным вызовам «Shape :: reset» на объекты «Point» из других единиц компиляции, которые знали бы о «Point» но не о 'Point :: reset'. –