Подтвердить что ты не робот

Виртуальная функция const vs виртуальная функция non-const

class Base
{
   public:
   virtual void func() const
   {
     cout<<"This is constant base "<<endl;
   }
};

class Derived : public Base
{
   public:
   virtual void func()
   {
     cout<<"This is non constant derived "<<endl;
   }
};


int main()
{
  Base *d = new Derived();
  d->func();
  delete d;

  return 0;
}

Почему вывод выводит "Это постоянная база". Однако, если я удаляю const в базовой версии func(), он печатает "Это не константа"

d- > func() должен вызывать версию Derived right, даже если Base func() является const правильным?

4b9b3361

Ответ 1

 virtual void func() const  //in Base
 virtual void func()        //in Derived

const часть фактически является частью сигнатуры функции, что означает, что производный класс определяет новую функцию, а не переопределяет функцию базового класса. Это потому, что их подписи не совпадают.

Когда вы удаляете часть const, тогда их подпись совпадает, а затем компилятор видит определение производного класса func как переопределенную версию функции базового класса func, поэтому функция производного класса вызывается, если Тип времени выполнения объекта Derived. Это поведение называется полиморфизмом во время выполнения.

Ответ 2

virtual void func() фактически имеет другую подпись, чем virtual void func() const. Таким образом, вы не переопределили исходную базовую функцию только для чтения. В результате вы создали новую виртуальную функцию в Derived.

Вы также можете узнать об этом больше, если попытаетесь создать указатели на функции-члены (PTMF), но это редкая необходимость (может быть, это полезно для изучения или практики).

Ключ переопределения на С++ 11 особенно удобен, чтобы избежать подобных ошибок. Затем компилятор скажет вам, что ваше определение "func" в производном не отменяет ничего.

Ответ 3

Нет, потому что virtual void func() не является переопределением для virtual void func() const.