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

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

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

2 ответа

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

Другие вопросы по тегам