在C++中,对于两个函数,一个有const修饰,一个没有const修饰,认为这两个函数是不同的函数。
而虚函数的要求是,函数原型相同,函数原型包括:函数返回值、函数名、参数列表、const修饰符。这里const修饰符包括函数返回值的修饰,函数形参的修饰,函数本身的修饰。只要有一处const没有对上 ,那么就不是虚函数的重载,而是发生了同名覆盖现象。这个与编译器的工作原理有关。
所以对于基类的cosnt虚函数,如果子类重写的时候忘记加上const,那么认为是重载了基类的函数,这就是同名覆盖现象。
如下列代码:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void show()const
{
cout << "this is base." << endl;
}
};
class Drived: public Base
{
public:
void show()
{
cout << "this is drived." << endl;
}
};
void main()
{
Base *p = new Base;
p->show();
p = new Drived;
p->show();
}
上述,子类的show实际上覆盖了基类的show。这不是多态。