Виртуальная функция 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 правильным?
Ответы
Ответ 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
.