C++中的继承特性(1)
来源:互联网 发布:手机vr摄像软件 编辑:程序博客网 时间:2024/05/09 17:23
1.何为继承
首先,继承是什么?继承可以简单理解为孩子继承了父母双亲的基因,在拥有父母某些特性的同时,又有自己独立的特性。
在C++中,继承是类与类之间的继承,即某个类可以继承它类的成员变量、成员函数,同时又可以拥有自己独有的成员变量、成员函数。
继承定义格式如下:
class <派生类类名>: <继承方式> <基类类名>{};
派生类即新生成的类,相当于孩子,又称子类;基类即原有的类,相当于父亲,又称父类。
其中继承方式有如下三种:
public(公有继承):将保留基类成员的原有访问权限。即基类中的public成员仍为public,protected成员仍为protected,private仍为private且派生类无权访问。
protected(保护继承):将保护基类的所有成员。基类中的私有成员(private)仍无权访问,但public和protected成员将均作为保护成员继承。
private(私有继承):将以私有方式继承基类的所有成员。即无论成员变量原有访问权限是什么,在派生类中均为私有属性,但基类的私有成员派生类仍无权访问。
2.友元与继承
在类中,友元函数时可以访问类中的私有成员的,那么它是否可以访问派生类中的私有成员呢?
在下图程序代码中,test函数访问了派生类B的私有成员_b:
由图可以看到,基类A中的友元函数test无法访问派生类B中的私有成员,即友元关系是不会被继承的,因为友元函数并不属于基类自身的函数。
3.构造、析构的继承
在继承中,构造与析构并不会拷贝到派生类中,而是在派生类构造函数的初始化列表中会自动调用基类的构造函数,示例程序如下:
class Parent{public: Parent(){ cout << "Parent()" << endl; } ~Parent(){ cout << "~Parent()" << endl; }private: int _p;};class Child:public Parent{public: Child(){ cout << "Child()" << endl; } ~Child(){ cout << "~Child()" << endl; }private: int _c;};void FunTest(){ Parent p; Child c;}int main(){ FunTest(); system("pause"); return 0;}
程序最终运行结果如下:
(1)构造函数的执行过程
a)其中第一个Parent()是构造对象p时输出的,汇编指令如下图:
b)而后在构造对象c时,首先进入c的构造函数,如下图:
c)在下图中可以看到,在执行构造函数体(即输出”Child()”字符串)之前,程序会调用一次Parent构造函数,故派生类会在构造函数的初始化列表中调用基类的构造函数。
总结:派生类构造函数执行如下:
(2)析构函数的执行过程
在一个函数执行完毕后,需将其中的局部变量释放,若局部变量是某类的对象,则释放前会调用类的析构函数。
a)对于FunTest函数,先定义了p对象,再定义了c对象,则会先释放c,再释放p,汇编指令如下:
b)而后进入派生类Child的析构函数:
c)执行了函数体之后:
d)在Child析构函数执行完毕后可看到如下一条call指令,故而在析构c对象时,会先打印~child(),再打印~Parent():
总结:派生类析构函数执行过程如下:
由栈的先进后出原则,先定义的变量必定最后释放,故析构变量的顺序也是如此。
本文为博主初学继承的一些认识,如有错误或不当之处,欢迎大家批评指正!
- C++中的继承特性(1)
- C++中的继承特性(2)
- javascript中的继承特性
- C++特性的C语言实现(1)继承
- objective-c中的特性
- objective-c中的特性
- 【C++】c++中的继承
- Objective-c中的C特性
- Object-C中的特性-----property
- Objective-C中的属性特性
- 浅谈Objective-C中的继承
- 【C++】浅谈C++中的继承
- 【C++】浅析C++中的继承
- 继承特性
- 继承中的成员变量的特性(私有成员的访问方法)
- 改善C++程序的建议:语法篇1<从C继承而来的特性>
- Objective-C基础(面向对象--下--三大特性--继承、多态)
- objective-c中的cocoa特性:KVC-键值编码(十三)
- Greenplum学习8--节点分布模式:grouped、spread
- Java工程师成神之路
- dos (DOS命令讲解)
- Linux 虚存的性能问题
- 有关TinyXML使用的简单总结:来解析XML数据
- C++中的继承特性(1)
- C#+aspx+ajaxfileupload 实现图片上传
- 第八周OJ项目-打印数字图形
- 谷歌机器学习系统 TensorFlow v0.11.0 RC1 发布
- Android安卓 腾讯云第一道坎
- 安装Oracle_1
- 我对《敏捷软件开发宣言》的理解
- yii2常用小技巧
- win7针对未分配磁盘怎样创建扩展分区