Я играл в с ++ правило. Я столкнулся с ошибкой, но не могу ее объяснить. Пожалуйста, помогите объяснить, почему произошла ошибка компиляции. Кстати, я не заинтересован в решении проблемы. Спасибо
Q1, почему скрытие имени не работает в этом случае? например, если мы удалим ключевое слово lineA virtual.компиляция будет работать
Q2 после добавления функции в case2, компиляция проходит.
пожалуйста, помогите объяснить Q1 и Q2.
#включают
using namespace std;
class base
{
public:
virtual int func() // lineA
{
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()
{
return 0;
}
выход:
main.cpp:18:14: error: conflicting return type specified for 'virtual double derived::func()'
double func()
^
main.cpp:8:19: error: overriding 'virtual int base::func()'
virtual int func()
случай 2:
#include <iostream>
using namespace std;
class base
{
public:
virtual int func()
{
cout << "vfunc in base class\n";
return 0;
}
// new added
virtual double func(int)
{
return 0.0;
}
};
class derived: public base
{
public:
double func(int)
{
cout << "vfunc in derived class\n";
return 0;
}
};
int main()
{
return 0;
} ^
Когда вы переопределяете функцию, ваша новая реализация должна вызываться каждый раз, когда была оригинальная. base
функция здесь возвращает int
, Это означает, что любой абонент будет ожидать int
,
Ошибка возникает потому, что ваша переопределяющая функция возвращает double
вместо int
,
Также как и ошибки компилятора, вы определили разные типы возвращаемых данных для func (). Вы можете подумать, что это должно быть связано с перегрузкой C ++, но перегрузка может быть выполнена только для входных параметров, а не для возвращаемых значений.
Например:
class base
{
public:
virtual int func(int param)
{
cout << "vfunc in base class\n";
return 0;
}
};
class derived: public base
{
public:
double func(double param)
{
cout << "vfunc in derived class\n";
return 0;
}
};
В этом коде func перегружен в производном, так как у него есть другой тип для входного параметра.