文章概述

  1. 类型(赋值)兼容性原则;
  2. 类型(赋值)兼容性原则可以分为2个情况;
  3. 继承中的对象模型(内存模型);
  4. 继承中的构造析构调用原则;
  5. 继承和组合混搭下的构造和析构;
  6. 继承中同名的成员函数和成员变量处理方法;
  7. 继承中的static关键字

类型(赋值)兼容性原则

a. 类型(赋值)兼容性原则的说明: 需要基类对象的任何地方,都可以用公有派生类对象代替。通过公有继承,派生类得到了基类中除构造函数和析构函数以外的所有成员。实际上,公有派生类实际具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。
b. 类型(赋值)兼容性原则可以代替的情况:

代替之后,派生类对象可以直接作为基类的对象使用,但是只能用从派生类继承的成员。


类型(赋值)兼容性原则可以分为2个情况

a.第一个层次:

  • 基类指针(引用)指向子类对象
//P父类  C子类
P* p =NULL;
C c;
p =&s;
  • 父类指针做函数参数
void P(P* p);
  • 父类引用做函数参数
void P(P& p);

b.第二个层次:

  • 子类对象初始化父类对象
C c;
P p =c;
  • 子类对象赋值父类对象
C c;
P p;
p =c;

继承中的对象模型(内存模型)

a. 一个类中的对象模型:

class A
{protected:int a;
}

创建A类的对象时,会将成员函数和成员变量分开存储。a. 普通的成员变量存储在变量中; b. 静态的成员变量存储在全局区; c.成员函数存储在代码片段区。
b. 继承中的对象模型:

class A
{protected:int a;
}
class B:public A
{protected:int b;
}


(子类是由父类成员和新的子类成员叠加得到的)
问题: 对象b中对于变量a和b初始化是一样的吗???
不一样,子类对象构造时,需要调用父类的构造函数对其继承的成员变量初始化。子类对象析构时,会调用父类的析构函数对其继承的成员进行清理。—–》分工明确


继承中的构造析构调用原则

a. 子类对象在创建时会首先调用父类的构造函数;
b. 父类构造函数执行完毕后,执行子类的构造函数;
c. 当父类的构造函数中有参数时,必须在子类的初始化列表中显示调用;
d. 析构函数执行的顺序和构造函数的执行顺序相仿。

//写子类的构造函数时,必须要看看父类的构造函数能否被自动调用;
//若不能被自动调用,应该显示调用
class A
{int a;
public:A(int a){this->a = a;}
};class B:public A
{int b;
public:B(int b):A(10){this->b = b;}
};

继承和组合混搭下的构造和析构

class C
{int c;
public:C(int c){this->c = c;cout << "组合对象" << endl;}
};class A
{int a;
public:A(int a){this->a = a;cout << "父类" << endl;}
};class B:public A
{int b;C c;
public:B(int b,int a,int c):A(a),c(c){this->b = b;cout << "子类" << endl;}
};int main()
{B b(20,10,5);return 0;
}

输出结果:

继承与组合对象混搭情况,构造与析构调用规则结论:
a. 先调用父类的构造函数,再调用组合对象的构造函数,最后调用自己的构造函数;
b. 先调用自己的析构函数,再调用组合对象的析构函数,最后调用父类的析构函数。


继承中同名的成员函数和成员变量处理方法

a. 当子类的成员变量和父类的成员变量同名时,子类依然从父类中继承同名变量,但是子类的同名变量会屏蔽父类的同名变量。子类中使用父类名+作用域符使用父类的同名成员变量。同名变量存储在不同的内存中。
b. 继承的同名成员变量和成员函数类似。

class A
{int x;
public:int a;A(int a){this->a = a;cout << "父类" << endl;}
};class B:public A
{int a;
public:B(int a,int b):A(a){this->a = b;cout << "子类" << endl;}void printF(){cout << A::a << endl;}
};int main()
{B b(20,10);cout << sizeof(b) << endl;A a(10);cout << sizeof(a) << endl;return 0;
}

对代码分析:


继承中的static关键字

a. 基类定义的静态成员将被所有的派生类共享;
b. 根据static成员自身的访问特性和派生类的继承方式,在类中具有不同的访问性质;
c. 派生类中访问静态成员,使用以下两种形式:

  • 类名::成员名
  • 对象名.成员名
    d. 初始化静态成员变量不是简单的初始化,要告诉C++编译器为静态变量分配内存;
    e. 单例中将构造函数设为私有的,不能在外部创建对象;别的情况应该将构造函数设为公有,不然无法创建对象。
class A
{
public:static int x;int a;
public:A(int a){this->a = a;x +=10 ;cout << "父类" << endl;}
};int A::x = 50;class B:public A
{int a;
public:B(int a,int b):A(a){this->a = b;x += 10;cout << "子类" << endl;}void printF(){cout << A::a << endl;}
};int main()
{B b(20,10);cout << sizeof(b) << endl;A a(10);cout << sizeof(a) << endl;cout << A::x << endl;return 0;
}

C++ 类(继承中的构造和析构)相关推荐

  1. c++继承中的构造和析构

    c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...

  2. C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  3. C++继承中的构造与析构

    文章目录 1 C++继承中的构造 1.1 子类对象初始化父类成员的方式 1.2 子类对象的构造 2 C++继承中的析构 2.1 子类对象的析构 1 C++继承中的构造 1.1 子类对象初始化父类成员的 ...

  4. C++_类和对象_C++继承_继承中的构造和析构顺序---C++语言工作笔记064

    然后我们再去看c++中的构造和析构函数的执行的顺序. . 直接用案例说明,可以看到,上面呢,我们写个Base类,然后 写这个类的构造方法. 然后我们在Base类中写上构造方法,和析构方法. 然后我们再 ...

  5. 【C++深度剖析教程25】继承中的构造与析构

    今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...

  6. (转)剖析Delphi中的构造和析构

    剖析Delphi中的构造和析构 1 Delphi中的对象模型: 2 1.1 对象名表示什么? 2 1.2 对象存储在哪里? 2 1.3 对象中存储了什么?它们是如何存储的? 3 2 构造函数与创建对象 ...

  7. C# 类型运算符重载在类继承中的调用测试

    C# 类型运算符重载在类继承中的调用测试 这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA {}class CB : CA{}class CC : CB{}}void Test(CA ...

  8. C++知识点47——类继承中的类型转换与访问权限控制(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109768311 五.派生类向基类转换的可访问性 当一个子类向基类转化时:有以下三条规则 ...

  9. 【python】类继承中super的用法

    阅读本文,需要知道python中的类与继承的概念. 1.总述 在python中,通过类的继承机制,可以实现在子类中调用父类的方法,从而避免写重复的代码.但在面临多继承时,如果多个父类中都实现了某个相同 ...

  10. 类继承中的构造函数与析构函数

    构造函数初始化列表 子类的初始化列表,只能对子类的成员变量进行初始化 class Base{ public:int x; };class Derived : public Base { public: ...

最新文章

  1. pythonos模块修改文件名_python如何动态改变文件名
  2. 【数据分析】干货!一文教会你 Scrapy 爬虫框架的基本使用
  3. 计算机专业考研过关率高么,考研过国家线的几率有多大?被刷的有多少?
  4. 工作209:整理订单的重置逻辑
  5. navicat如何导入sql文件和导出sql文件
  6. 基于CNN实现对摄像头捕捉的人脸进行性别和年龄的预测
  7. (四)揭开数据分析方案的神秘面纱——一案在手,成竹在胸
  8. jq控制div是否展示_jQuery判断一个元素是否可见的方法
  9. 菜鸟必知之网络安全常识
  10. 怎么发送电子邮件到别人邮箱?手把手教你!
  11. 多无人机任务分配与路径规划算法学习(一)
  12. 实名认证(二要素校验)-含手机验证码校验
  13. E-R 图的不同表示方法(Chen 方法和 Crow‘s foot 方法)
  14. 如何利用手机翻译软件进行中文翻译英语
  15. 高速精密直线电机模组组成及应用
  16. java画球_我的世界java版指令画球教程
  17. 从架构上详解技术(SLB,Redis,Mysql,Kafka,Clickhouse)的各类热点问题
  18. 珠城科技在创业板上市:IPO首日跌破发行价,市值相对蒸发约7亿元
  19. iOS开发-常用第三方开源框架介绍(2)
  20. 淘宝商品详情API接口(app、h5端)

热门文章

  1. Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced)
  2. jQuery插件及表单验证
  3. ubuntu独立显卡驱动
  4. [每日一氵] mmSeg 报错 StopIteration
  5. Meltdown攻击
  6. IP 地址 与硬件地址
  7. DataStory创始人兼CEO徐亚波博士获年度青年创业榜样奖项
  8. 怀旧服ouf头像插件_魔兽世界怀旧服EUI插件 V9.0.1.6 官方版
  9. git命令将项目克隆到本地
  10. 学java用不用学ps_【No935】零基础学习从入门到精通Ps课程