关于子类继承父类函数原理的问题

yfjok22 2016-10-20 11:32:22
各位大侠好

最近由一个简单的case引发了一点思考,想请各位指点指点

#include <iostream>
using namespace std;

class Base
{
public:
void f()
{
cout << "Base::f" << endl;
}
};

class Derived : public Base
{
public:
void f()
{
cout << "Derived::f" << endl;
Base::f();
}
};

int main()
{
Derived d;
d.f();
d.Base::f();
return 0;
}

这是个很简单的case,子类Derived父类Base都有成员函数f()
根据C++标准,如果子类定义了同名成员函数,则将会覆盖父类中的定义。但根据这个case,在子类Derived定义了f()之后,一样是可以引用父类Base中的f()的,不过必须在前面加上类名Base,而且在该代码中甚至在main函数中使用了d.Base::f()
针对于以上现象,想请教下
1. 子类Derived中定义的所有函数与变量,是否在编译中默认在前面增加this,比如此例中Derived定义的f(),实际上是this->f()
2. 为什么在编译过程中,子类可以覆盖父类定义的同名函数
3. 如果在子类Derived中要使用父类Base中定义的f(),要写为Base::f(),是否意味着父类名Base本身是命名空间
4. 为什么子类对象d,能够通过想调用成员函数一样,使用d.Base::f()来调用父类函数
5. 最重要的,类的继承本质是什么,它在编译时究竟是如何处理的
...全文
234 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-10-21
  • 打赏
  • 举报
回复
类继承的本质就是代码共用,在已有功能上增加新的功能
paschen 版主 2016-10-21
  • 打赏
  • 举报
回复
覆盖说的是:子类对象直接调用f()时,使用的是子类的f 并不是子类的f 内容覆盖基类,两个f 都是存在且独立的 成员函数中调用f() 相当于 this->f() 因覆盖指的是查找名称上的覆盖,所以如果要调用基类的,不能直接写f(),否则调用的是子类的,要写成Base::f() 同理,在类外不能直接写d.f() 要写成 d.Base::f()
penghuahuijuan 2016-10-21
  • 打赏
  • 举报
回复
引用 2 楼 a7716021 的回复:
所谓继承,通俗的理解就是字面上的意思,即把父类的所有东西都继承到子类里,也就是说,在子类里,即使未定义任何新的函数和变量,也是默认拥有父类的所有函数和成员变量的。只不过未显示出来而已。但如果此时,你又定义了一个新的函数,却又和父类里的函数同名。这就会引起歧义。所以c++需要有一个规则,来避免这种情况。也就是说,子类如果和父类有同名函数,则用子类的。但这并不代表父类的函数就不存在了,只不过你正常使用的时候,使用的都是子类的罢了。如果想用父类的函数,就要像你写的那样:Base::f() 对于命名空间,主要用处就是区分名字,防止同名变量冲突问题。
a7716021 2016-10-21
  • 打赏
  • 举报
回复
所谓继承,通俗的理解就是字面上的意思,即把父类的所有东西都继承到子类里,也就是说,在子类里,即使未定义任何新的函数和变量,也是默认拥有父类的所有函数和成员变量的。只不过未显示出来而已。但如果此时,你又定义了一个新的函数,却又和父类里的函数同名。这就会引起歧义。所以c++需要有一个规则,来避免这种情况。也就是说,子类如果和父类有同名函数,则用子类的。但这并不代表父类的函数就不存在了,只不过你正常使用的时候,使用的都是子类的罢了。如果想用父类的函数,就要像你写的那样:Base::f() 对于命名空间,主要用处就是区分名字,防止同名变量冲突问题。
ipqtjmqj 2016-10-21
  • 打赏
  • 举报
回复
1. 子类Derived中定义的所有函数与变量,是否在编译中默认在前面增加this,比如此例中Derived定义的f(),实际上是this->f() 编译时肯定不加this,要加也是加类似于Derived之类的 2. 为什么在编译过程中,子类可以覆盖父类定义的同名函数 实际上父类定义的函数是存在的,只不过不显式指出时,默认用近的,即子类的,为什么可以覆盖,当然是因为同名了。 3. 如果在子类Derived中要使用父类Base中定义的f(),要写为Base::f(),是否意味着父类名Base本身是命名空间 写成这样当然是为了和子类的区别了,类名有命名空间的作用,但还是有的区别的。 4. 为什么子类对象d,能够通过想调用成员函数一样,使用d.Base::f()来调用父类函数 不能调用父类函数,那继承一点用也没有了。 5. 最重要的,类的继承本质是什么,它在编译时究竟是如何处理的 继承的本质就是对父类扩展一些属性与方法,比如父类为人,属性有性别,子类为学生,属性增加学号

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧