C++ 类(继承中的构造和析构)
文章概述
- 类型(赋值)兼容性原则;
- 类型(赋值)兼容性原则可以分为2个情况;
- 继承中的对象模型(内存模型);
- 继承中的构造析构调用原则;
- 继承和组合混搭下的构造和析构;
- 继承中同名的成员函数和成员变量处理方法;
- 继承中的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++ 类(继承中的构造和析构)相关推荐
- c++继承中的构造和析构
c++继承中的构造和析构 类型兼容性原则 类型兼容规则中所指的替代包括以下情况: 继承中的对象模型 继承中构造和析构 继承中的构造析构调用原则 继承与组合混搭情况下,构造和析构调用原则 继承中的同名成 ...
- C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式
目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...
- C++继承中的构造与析构
文章目录 1 C++继承中的构造 1.1 子类对象初始化父类成员的方式 1.2 子类对象的构造 2 C++继承中的析构 2.1 子类对象的析构 1 C++继承中的构造 1.1 子类对象初始化父类成员的 ...
- C++_类和对象_C++继承_继承中的构造和析构顺序---C++语言工作笔记064
然后我们再去看c++中的构造和析构函数的执行的顺序. . 直接用案例说明,可以看到,上面呢,我们写个Base类,然后 写这个类的构造方法. 然后我们在Base类中写上构造方法,和析构方法. 然后我们再 ...
- 【C++深度剖析教程25】继承中的构造与析构
今天来学习C++中继承的构造与析构,有兴趣一起学习的加qq:1126137994 1.问题 如何初始化父类成员?父类构造函数与子类构造函数有什么关系? 子类对象是如何构造的? 子类中可以定义构造函数 ...
- (转)剖析Delphi中的构造和析构
剖析Delphi中的构造和析构 1 Delphi中的对象模型: 2 1.1 对象名表示什么? 2 1.2 对象存储在哪里? 2 1.3 对象中存储了什么?它们是如何存储的? 3 2 构造函数与创建对象 ...
- C# 类型运算符重载在类继承中的调用测试
C# 类型运算符重载在类继承中的调用测试 这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA {}class CB : CA{}class CC : CB{}}void Test(CA ...
- C++知识点47——类继承中的类型转换与访问权限控制(下)
接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109768311 五.派生类向基类转换的可访问性 当一个子类向基类转化时:有以下三条规则 ...
- 【python】类继承中super的用法
阅读本文,需要知道python中的类与继承的概念. 1.总述 在python中,通过类的继承机制,可以实现在子类中调用父类的方法,从而避免写重复的代码.但在面临多继承时,如果多个父类中都实现了某个相同 ...
- 类继承中的构造函数与析构函数
构造函数初始化列表 子类的初始化列表,只能对子类的成员变量进行初始化 class Base{ public:int x; };class Derived : public Base { public: ...
最新文章
- pythonos模块修改文件名_python如何动态改变文件名
- 【数据分析】干货!一文教会你 Scrapy 爬虫框架的基本使用
- 计算机专业考研过关率高么,考研过国家线的几率有多大?被刷的有多少?
- 工作209:整理订单的重置逻辑
- navicat如何导入sql文件和导出sql文件
- 基于CNN实现对摄像头捕捉的人脸进行性别和年龄的预测
- (四)揭开数据分析方案的神秘面纱——一案在手,成竹在胸
- jq控制div是否展示_jQuery判断一个元素是否可见的方法
- 菜鸟必知之网络安全常识
- 怎么发送电子邮件到别人邮箱?手把手教你!
- 多无人机任务分配与路径规划算法学习(一)
- 实名认证(二要素校验)-含手机验证码校验
- E-R 图的不同表示方法(Chen 方法和 Crow‘s foot 方法)
- 如何利用手机翻译软件进行中文翻译英语
- 高速精密直线电机模组组成及应用
- java画球_我的世界java版指令画球教程
- 从架构上详解技术(SLB,Redis,Mysql,Kafka,Clickhouse)的各类热点问题
- 珠城科技在创业板上市:IPO首日跌破发行价,市值相对蒸发约7亿元
- iOS开发-常用第三方开源框架介绍(2)
- 淘宝商品详情API接口(app、h5端)
热门文章
- Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced)
- jQuery插件及表单验证
- ubuntu独立显卡驱动
- [每日一氵] mmSeg 报错 StopIteration
- Meltdown攻击
- IP 地址 与硬件地址
- DataStory创始人兼CEO徐亚波博士获年度青年创业榜样奖项
- 怀旧服ouf头像插件_魔兽世界怀旧服EUI插件 V9.0.1.6 官方版
- git命令将项目克隆到本地
- 学java用不用学ps_【No935】零基础学习从入门到精通Ps课程