Рассмотрим пример ниже:
#include <iostream>
using namespace std;
class base
{
public:
virtual int func()
{
cout << "vfunc in base class\n";
return 0;
}
};
class derived: public base
{
public:
double func()
{
cout << "vfunc in derived class\n";
return 0;
}
};
int main()
{
base *bptr = new derived;
bptr->func();
return 0;
}
Компилятор выдает ошибку для приведенного выше кода, что для переопределенной функции существует конфликтующий тип. Почему нельзя переопределить функцию в производном классе с другим типом возврата?
Я считаю, что для переопределения функции виртуальный метод базового класса должен быть переопределен в производном классе. Чтобы переопределить метод, сигнатуры методов должны быть одинаковыми. Поскольку тип возврата не является частью сигнатуры, я полагаю, что даже если тип возврата отличается, метод все равно будет переопределен? В таком случае в приведенном выше коде виртуальная функция func
переопределяется в производном классе с другим типом возврата. Но компилятор выдает ошибку. Правильно ли я понимаю?