解密c++特性下的继承属性

  • 继承方式

常见地,在抽象一个c++类的时候,通常需要加入访问限定符,一般的,将成员变量定义为私有,成员函数作为公有,成员函数则成为外部访问私有成员变量的一个接口

如果发现一个类中没有明确指定访问限定符,class一般默认访问限定为private私有   而在struct中一般默认访问限定为public公有

具体的继承方式及访问限定如下图

其中,私有成员在类外不可访问,只有类内部可访问,除非定义为该类的友元函数

如果想让基类的成员仅在派生类中依然可访问,但在类外不可访问,可以将其定义为protect成员

除基类的私有成员在子类中是不可见的,其余基类成员在子类中额访问方式为:min(继承方式,访问限定符)

  • 继承赋值

派生类对象可以赋值给基类对象,指针或引用      派生类由于继承的关系,比基类大,所以赋值过程类似于一个切片过程

反过来,基类对象不能给派生类对象赋值,   派生类的一部分成员在基类中不存在  无法完成赋值

  • 继承的作用域

子类和父类中存在同名函数,则构成隐藏,子类成员将屏蔽父类对同名成员函数的访问,此时只会访问父类同名函数,除非通过类名::同名函数  显示调用

注意:只要函数名相同,便会形成隐藏,对此在继承过程中,尽量避免同名函数

  • 派生类的默认成员函数

  1. 派生类的构造函数必须调用基类的构造函数初始化基类部分成员,如果基类中没有默认的构造函数,则必须在子类构造函数初始化列表中进行初始化
  2. 如果子类采用默认构造函数,编译器会调用父类的默认构造函数,如果父类不存在默认构造则报错返回
  3. 派生类的拷贝构造函数必须通过调用基类拷贝构造函数完成基类拷贝初始化,派生类构造函数初始化列表可以采用父类构造函数或父类拷贝构造函数切片操作
  4. 派生类构造函数和析构函数的调用顺序如下图:

  • 虚拟继承

存在以下菱形继承关系

根据代码测试各个类大小发现,菱形继承下,存在数据冗余情况,以及二义性

class A
{
public:int _a;
};
// class B : public A
class B : virtual public A
{
public:int _b;
};
// class C : public A
class C : virtual public A
{
public:int _c;
};
class D : public B, public C
{
public:int _d;
};
int main()
{D d;d.B::_a = 1;d.C::_a = 2;d._b = 3;d._c = 4;d._d = 5;return 0;
}

这里可以分析出D对象中将A放到的了对象组成的最下面,这个A同时属于B和C,那么B和C如何去找到公共的A呢?

这里是通过了B和C的两个指针,指向的一张表。这两个指针叫虚基表指针,这两个表叫虚基表。虚基表中存的偏移量。通过偏移量可以找到下面的A

解密C++(一)继承属性相关推荐

  1. C++访问属性和继承属性浅析

        对于初学者C++的属性控制以及继承属性还是比较那掌握的,笔者在这里总结一下自己学习这些过程的见解.首先我们来看: 1.C++支持的访问属性有public.protected.private,下 ...

  2. 如何更好地理解Javascript对象的自有属性和原型继承属性

    Javascript对象具有"自有属性"(own property),也有一些属性是从原型对象继承而来的.为了更好地理解对象自有属性和继承属性下面的示例深入解释了属性的访问和设置细 ...

  3. 继承属性inh和综合属性syn的作用

    继承属性inh和综合属性syn的作用 因为文法不是为了翻译而定义的,而是以语法分析为目的进行定义的,因此可能会产生语法分析树的结构和源代码的抽象语法不"匹配". 例如,下面的文法便是按照人类 ...

  4. python继承属性_python继承,属性查找顺序

    以为python支持多继承,因此在复杂的继承关系下很容易弄错属性的查找顺序,今天特意学习了下 python3用的是c3线性化算法,听名字很高大上,公式我也看了,看不懂,但是这不影响理解查找的顺序 先看 ...

  5. 继承属性:定义交通工具类Vehicle,一个小车类Car,一个公共汽车Bus类,实现Car、Bus对Vehicle的继承

    java中输出以下内容: 定义交通工具类Vehicle,一个小车类Car,一个公共汽车Bus类,实现Car.Bus对Vehicle的继承,按以下要求设计: ①交通工具类Vehicle,属性包括:品牌. ...

  6. Java继承属性后内存,java - Jackson:继承和必需的属性 - 堆栈内存溢出

    我目前正在尝试使用能够处理多态性的杰克逊(Jackson)实现反序列化器,也就是说,给定这两个类: public abstract class Animal { private String name ...

  7. python mro--多继承属性查找机制

    还记得什么是新式类和旧式类吗? python中,一个class继承于object,或其bases class里面任意一个继承于object,这个class都是new-style class. ---- ...

  8. 前端学习(64):css继承属性小结

    今天来总结一点关于css中哪些属性可以被继承,哪些不可以被继承.不是很全,仅供大家参考,也方便于自己以后复习. 一.不能被继承的属性 1.display:规定元素应该生成的框的类型 2.文本属性: v ...

  9. python继承属性_Python中的属性继承问题

    不久前,我在开发一个python应用程序,我在类中使用了很多属性,但是当我试图重写派生类中基类的访问器的行为时,我遇到了麻烦.这是我的问题的草图:class Person(object): @prop ...

最新文章

  1. C#利用Attribute实现简易AOP介绍 (转载)
  2. 使用socket的Linux上的C语言文件传输顺序服务器和客户
  3. 【转】根据起止日期+时间取数
  4. 为什么要在游戏中复刻现实?我们能获得怎样的乐趣?
  5. 源路由 小实验 小发现
  6. leetcode 8: 字符串转整数(atoi)
  7. 【英语学习】【WOTD】veritable 释义/词源/示例
  8. extjs chart无法在panel中显示_HighChart教程:Swift中的Highcharts iOS库
  9. Java中遍历文件夹的2种方法
  10. kubernetes service的作用、类型、关系和工作原理ClusterIp、NodePort、LoadBalance、ExternalName
  11. 微信数据清空了怎么办?误删微信聊天记录怎么恢复
  12. 5月6号基金分析的那篇文章,时隔两个月收益如何?
  13. 哪种销售方式更能深入人心?
  14. php根据键值排序,数组根据某个键值排序
  15. 刚性PCB和柔性PCB的区别
  16. 尝鲜——Windows11 安装教程 (无视TMP2.0)
  17. Linux防止stack缓冲区溢出的有效方法
  18. 线圆示例(Line Circle)
  19. HyperDAO跨链搭桥:启动万链自由交换时代
  20. Goldengate辅助数据库进行升级

热门文章

  1. c语言连接字符串不用strcat,不要strcat函数连接两个字符串
  2. 很多时候我们所需要的是目标
  3. 学习Android开发是否有前途?
  4. 健身房管理系统增加了这些功能,让管理事半功倍—捷径系统
  5. 实践企业内控,需与流程沟通
  6. 第一次与病毒亲密接触——江民倒下了,瑞星能坚挺
  7. Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench
  8. CSS滚动条样式设置
  9. 对耳朵伤害最小的耳机类型是什么?骨传导耳机
  10. 数项级数——(三)一般项级数