ошибка компиляции в отношении сокрытия имени, переопределения и виртуальной таблицы

Я играл в с ++ правило. Я столкнулся с ошибкой, но не могу ее объяснить. Пожалуйста, помогите объяснить, почему произошла ошибка компиляции. Кстати, я не заинтересован в решении проблемы. Спасибо

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;
}             ^

-1

Решение

Когда вы переопределяете функцию, ваша новая реализация должна вызываться каждый раз, когда была оригинальная. base функция здесь возвращает int, Это означает, что любой абонент будет ожидать int,

Ошибка возникает потому, что ваша переопределяющая функция возвращает double вместо int,

0

Другие решения

Также как и ошибки компилятора, вы определили разные типы возвращаемых данных для 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 перегружен в производном, так как у него есть другой тип для входного параметра.

0

По вопросам рекламы [email protected]