对于虚函数的重载,若在派生类中仅改变函数返回值,则编译器不允许!(这与非虚函数不同,非虚函数在派生类中若只改变返回值,是允许的,且隐藏基类的所有同函数名的版本)
其他情况则和非虚函数相同,只要派生类中对基类虚函数重新定义(函数体改变或参数类型或参数个数改变),基类的所有同函数名的重载版本均被隐藏,只有派生类中的重新定义的版本可直接使用!
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class Base
{
public:
Base(){}
virtual void func(string) const{
cout<<"Base::func()\n";
}
virtual int func() const {cout<<"Base"<<endl;return 1;}
};
class Derive1 : public Base
{
public:
Derive1(){}
//对Base中func override
int func() const{
cout<<"Derive1::func()\n";
return 1;
}
};
class Derive2 : public Base
{
public:
Derive2(){}
// !!! 重写虚函数返回类型有差异,且不是来自“Base::func”的协变
// !!! 只改变返回类型是不符合重写的!编译不通过
//!!! string func(string)const {cout<<"Derive2"<<endl;}
};
class Derive3 : public Base
{
public:
Derive3(){}
//对func重新定义,参数列表变化
int func(int )const {cout<<"Derive3"<<endl; return 1;}
};
int main()
{
Derive1 d1;
d1.func();
//!!! d1.func("123"); // Derive1对Base中的func override(覆盖)了,Base中所有重载版本都会被隐藏。
//显示调用基类的成员函数
d1.Base::func("123"); //不是覆盖了基类的func吗?为什么还能调用?Derive1虚表中有<span style="font-family:宋体;">三</span>个func? ?????
d1.Base::func(); // ?????
Derive2 d2;
Derive3 d3;
d3.func(1);
//!!! d3.func(); //Derive3中对func进行了重新定义(参数列表改变),基类的func的所有重载函数均被隐藏,不能调用func() 和func(string)
// !!! d3.func("123");
//
d3.Base::func();
d3.Base::func("123");
system("pause");
return 0;
}