初学C++遇到遇到继承和重载的一个问题

整个代码如下:

#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函数呢?

6个回答

子类调用父类的同名函数:

子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数。

子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion name或者如果在子类的定义中,使用using即可将子类的同名函数暴露,然后可直接调用.

子类和父类参数不同,函数名相同,有virtual关键字,则不存在多态性,子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion name。

子类和父类返回值不同,参数相同,函数名相同,有virtual关键字,则编译出错error C2555编译器不允许函数名参数相同返回值不同的函数重载。

cwj1112
cwj1112 "子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名函数被隐藏了,也可以强制调用父类的同名函数class::funtion name或者如果在子类的定义中,使用using即可将子类的同名函数暴露,然后可直接调用",解惑了,感谢!
3 年多之前 回复

单独写一个方法里面内容是 super.fun1()试试。

Derived里面只有一个fun1,虽然Base里也有一个,但是不能这样重载,编译器会先使用子类中的同名函数,如果没有,才会从父类中查找,子类中一旦出现了同名函数,则会自动忽略父类中的同名函数。这个问题你不是已经用Base::fun1这种形式解决了嘛,就是写起来逼死强迫症而已,习惯就好~

cwj1112
cwj1112 回复MLLBOCL: 在子类中重载明白,但我说的这种情况不明白,只能死记得了
3 年多之前 回复
qq_33675897
向英杰 回复MLLBOCL: 复制粘贴到子类中你就明白了
3 年多之前 回复
qq_33675897
向英杰 回复cwj1112: 就是说,子类中一旦搜索到了,就不会再从父类中找了,你可以把父类中的fun1
3 年多之前 回复
cwj1112
cwj1112 "子类中一旦出现了同名函数,则会自动忽略父类中的同名函数",即使名称相同,参数表不同(即重载),也会忽略吗?还是不明白为什么既然已经重载了,还是会忽略,又不是完全相同的函数。
3 年多之前 回复

同名函数相关问题,去看下,不难

C++中重载、重写(覆盖)和隐藏的区别,讲得很好 :blog.csdn.net/zx3517288/article/details/48976097

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐