对于c++中的继承,如果子类重写父类的virtual函数,那么子类重写的这个函数的返回类型和参数列表要满足什么要的要求呢?
可不可以和父类的那个virtual函数的返回类型或者参数列表不一样呢?
下面来实验一下:
我设计了三个类:base derived returns
他们分别是父类:base,子类:derived,以及用于测试的返回类:returns.
他们的结构如下:
base.h和base.cpp
#include "returns.h"
class base
{
public:
virtual returns* func();
};
returns* base::func()
{
return new returns(2,2.0);
}
derived.h/derived.cpp
#include "base.h"
class derived : public base
{
public:
returns* func(); //测试过程中,返回类型设置为returns,编译不通过。
}; //参数列表和父类不一致时,父类同名函数被隐藏,说明这是子类新的函数。
returns* derived::func()
{
return new returns(3,3.0);
}
returns.h/returns.cpp
class returns
{
public:
int a = 1;
double b = 3.14;
returns() = default;
returns(int _a, double _b);
};
returns::returns(int _a, double _b)
{
a = _a;
b = _b;
}
通过实验得出结论,子类想要重写父类的virtual函数,那么子类的这个函数的返回类型,名字,参数列表全部都得和父类一样,如果返回类型不一样,编译出错;如果参数列表不一致,父类函数会被隐藏,子类将不能再使用继承下来的那个函数,因为在函数匹配的时候,“重写”的那个参数不一样的函数永远是最佳匹配。
整个测试项目的代码可以去我的github仓库拿来测试。