本文讲述虚的重载函数在被继承时遇到的一个问题。
一 问题
假设有个基类如下,它有2个重载函数process,而且是虚函数,
class Base {
public:
virtual void process(int x) {qDebug() << "Base::p1\n";};
virtual void process(int a,float b) {qDebug() << "Base::p2\n";}
protected:
int pd;
float pb;
};
这时有个派生类如下,只覆写了第一个函数,
class derived: public Base
{
public:
virtual void process(int x) { std::cout << "Der::p1\n"; }
};
main函数如下,
int main()
{
derived d = derived();
d.process(100, 1.0); // 错误
}
编译时会报错,提示对象d没有这个函数,似乎和我们平时理解的不一样,平时理解的是如果子类不覆写父类的虚函数,那么调用时就会直接调用父类的对应函数。为什么这样呢?
在这里找到了答案,
When you override a virtual method in a class, any overloads of that method that are not overridden are hidden for that class and cannot be used.
意思就是如果基类里有多个同名的虚重载函数,只要在子类里没有被覆写,那么就会对子类隐藏,也就是子类无法使用这个未被覆写的重载函数。
二 解决办法
有2个解决办法,
1. 把剩余的虚重载函数在子类里也实现一遍
如下这样,
class derived: public Base
{
public:
virtual void process(int x) { std::cout << "Der::p1\n"; }
virtual void process(int x,float b) { std::cout << "Der::p2\n"; }
};
似乎有点蠢
2. 使用using来解决
class derived: public Base
{
public:
using Base::process;
virtual void process(int x) { std::cout << "Der::p1\n"; }
};
这样子类就可以调用基类的“process(int x,float b)”函数了。