博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类继承内存布局(三)
阅读量:6268 次
发布时间:2019-06-22

本文共 1366 字,大约阅读时间需要 4 分钟。

参考:http://blog.csdn.net/jiangyi711/article/details/4890889#

(三)成员函数

类X中每一个非静态成员函数都会接受一个特殊的隐藏参数——this指针,类型为X* const

该指针在后台初始化为指向成员函数工作于其上的对象

在成员函数内,成员变量的访问是通过在后台计算与this指针的偏移来进行

struct P {   int p1;   void pf(); // new   virtual void pvf(); // new};

声明虚成员函数会造成对象实例占用更多的内存空间,因为虚成员函数需要虚函数表指针

声明非虚成员函数不会造成对象实例的任何内存开销

P:pf()的点定义:

void P::pf() { // void P::pf([P *const this])   ++p1;   // ++(this->p1);}

P:pf()接收了一个隐藏的this指针参数,对每个成员函数的调用,编译器都会自动加上这个参数

在pf()函数内,对于成员变量的访问全部通过this指针进行,有的继承层次下this指针需要调整,访问成员的开销会增大

1)覆盖成员函数

和成员变量一样,成员函数也会被继承。通过在派生类中重新定义基类函数,一个派生类可以覆盖基类函数定义

覆盖是静态的还是动态的依赖于成员函数是否被声明为虚函数

 

class A{public:        int a;        virtual void func(){cout << "a ";cout << a << endl;}};class B : public A{public:        int a;        void func()        {                cout << a << endl;                A::func();        }};int main(){        B b;        b.a = 2;        b.A::a = 3;        b.func();        b.A::func();}

 

执行结果:

2

a 3

a 3

子类中的数据成员无论是否与父类中的数据成员同名,父类的数据都会被正常继承

如果子类重载了父类的成员函数,则会发生覆盖,但是仍然可以通过 父类名::成员函数名 的方式在子类中调用父类成员函数,同时由于数据成员会正常继承下来,所以用子类对象调用父类成员函数时,子类对象中的数据包含了父类的数据成员,成员函数中访问的变量会使用子类中继承下来的变量,无论变量名是否与子类中的相同 

除了虚函数,其他函数和数据都是静态绑定!!

b.A::func()中的func函数含有一个隐含的this指针 A *const,所以this->a将发生静态绑定,将调用实例b中的基类部分的数据a

基于const的重载:可以理解为const成员函数的隐藏this指针类型为 const A *const,非const成员函数的隐藏this指针类型为A *const,形参不同,实现函数重载

 

转载于:https://www.cnblogs.com/buptlyn/p/4358627.html

你可能感兴趣的文章
接口与抽象类的使用选择
查看>>
if __name__ == '__main__'
查看>>
CF 375D. Tree and Queries【莫队 | dsu on tree】
查看>>
Maven最佳实践 划分模块 配置多模块项目 pom modules
查看>>
Hadoop学习笔记——WordCount
查看>>
Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 1)
查看>>
Java-Spring-获取Request,Response对象
查看>>
opencv项目报错_pFirstBlock==pHead解决办法
查看>>
MySQL日志
查看>>
Oracle性能优化之Oracle里的执行计划
查看>>
电脑如何连接远程服务器?听语音
查看>>
使用Xcode 查看objective-C的汇编代码
查看>>
Vue.js——60分钟快速入门
查看>>
设计模式 - 模板方法模式(template method pattern) 具体解释
查看>>
mysql判断一个字符串是否包含某子串 【转】
查看>>
a bad dream
查看>>
FD_CLOEXEC用法及原因_转
查看>>
element UI 的学习一,路由跳转
查看>>
RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
查看>>
Spring JavaBean属性值的注入方式( 属性注入, 特殊字符注入 <![CDATA[ 带有特殊字符的值 ]]> , 构造器注入 )...
查看>>