整个代码如下:
#include
using namespace std;
class Base
{
public:
void fun1()
{
cout << "call Base fun1" << endl;
}
void fun2()
{
cout << "call Base fun2" << endl;
}
};
class Derived:public Base
{
public:
void fun1(int a)
{
cout << "call Derived fun1 " << a << endl;
}
};
int main(void)
{
Derived d;
//d.fun1();//编译报错
d.Base::fun1();
d.fun1(2);
d.fun2();
return 0;
}
子类中重载了父类的fun1函数,为何不能直接使用d.fun1()来调用父类中的fun1函数呢?
子类调用父类的同名函数:
子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。
子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion name或者如果在子类的定义中,使用using即可将子类的同名函数暴露,然后可直接调用.
子类和父类参数不同,函数名相同,有virtual关键字,则不存在多态性,子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion name。
子类和父类返回值不同,参数相同,函数名相同,有virtual关键字,则编译出错error C2555编译器不允许函数名参数相同返回值不同的函数重载。
单独写一个方法里面内容是 super.fun1()试试。
Derived里面只有一个fun1,虽然Base里也有一个,但是不能这样重载,编译器会先使用子类中的同名函数,如果没有,才会从父类中查找,子类中一旦出现了同名函数,则会自动忽略父类中的同名函数。这个问题你不是已经用Base::fun1这种形式解决了嘛,就是写起来逼死强迫症而已,习惯就好~
http://quanjie.leanote.com/post/%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B-2
同名函数相关问题,去看下,不难
C++中重载、重写(覆盖)和隐藏的区别,讲得很好 :blog.csdn.net/zx3517288/article/details/48976097