C++ 面向对象的三个特点--继承与封装(二)
顺着上一篇的内容,我们继续来了解继承的基本知识。
派生类的构造函数和析构函数
派生类继承了基类的成员,但是不能继承基类的构造函数和析构函数,首先,我们了解构造函数和析构函数的执行顺序是当我们创建一个派生类的对象是,先执行的是基类的构造函数,然后是派生类的构造函数。析构函数则正好相反,先执行派生类的析构函数,再执行基类的析构函数。
派生类构造函数和析构函数的构造规则
当基类的构造函数没有参数的时,或者没有显示的定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数。但是当基类带有含参数的构造函数的时候,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。
派生类构造函数的定义格式:
派生类名(参数总表) : 基类名(参数表)
其中基类的构造函数参数通常来源于派生类构造函数的参数总表,也可以设置为常数值。
例:
base:
base(int n)
derived:
derived(int n) : base(n)
或derived() : base(1)
还需注意的几点:
1).如果派生类的基类也是一个派生类,每个派生类只需负责他的直接基类的构造,依次上溯。
2).因为析构函数是不带参数的,在派生类中是否要定义析构函数与它所属的基类无关,它们是各自独立的。
3).派生类中含有内嵌对象成员时,构造函数的一般形式如下:派生类名(参数总表):基类名(参数表),内嵌对象名1(参数表),····,内嵌对象名n(参数表),此时构造函数的执行顺序是基类的构造函数,内嵌对象成员的构造函数(调用顺序按照声明顺序),派生类的构造函数。
EX:
// 基类
class Base
{
public:
Base(){a = ;b = ;}
Base(int x,int y)
{
a = x;
b = y;
}
virtual ~Base(void); void print()
{
printf("\na = %d b = %d", a, b);
} private:
int a,b;
}; // 派生类
class Derivel :
private Base
{
public:
Derivel():Base(, )
{
c = ;
d = ;
} Derivel(int x, int y):Base(x + , y + )
{
c = x;
d = y;
} Derivel(int x, int y, int m, int n):Base(m, n)
{
c = x;
d = y;
}
virtual ~Derivel(void); void print()
{
Base::print();
printf(" c = %d d = %d", c, d);
}
private:
int c,d;
}; // main
int _tmain(int argc, _TCHAR* argv[])
{
Base obj;
obj.print(); Derivel obj1;
obj1.print(); Derivel obj2(,);
obj2.print(); Derivel obj3(,,,);
obj3.print(); system("pause");
return ;
}
输出结果:
a = 0 b = 0
a = 1 b = 1 c = 0 d = 0
a = 11 b = 11 c = 10 d = 10
a = 20 b = 20 c = 10 d = 10
多重继承和多重继承的构造函数
声明两个及两个以上的基类的派生类称为多重继承。其声明格式一般如下:
Class 派生类名:继承方式1 基类名1,继承方式2 基类名2{
};
注意:当没有写明继承方式的时候按照默认的继承方式认定,默认的继承方式是private。
多重继承中,三种继承方式对于基类成员在派生类中的访问性的规则和单继承是一样的。
多重继承的构造函数的执行顺序与单继承构造函数的执行顺序相同,也是遵循先执行基类中的构造函数,在执行对象成员的构造函数,最后执行派生类的构造函数的原则。在各个基类之间,则严格按照派生类的声明顺序从左到右依次执行。而析构函数的话则是相反的。
EX:
// 基类1
class Base
{
public:
Base()
{
printf("Constructor base.\n");
} virtual ~Base()
{
printf("Destructor base.\n");
}
}; // 基类2
class Base1
{
public:
Base1()
{
printf("Constructor base1.\n");
} ~Base1()
{
printf("Destructor base1.\n");
}
}; // 派生类
class Derivel :
private Base,Base1
{
public:
Derivel()
{
printf("Constructor derivel.\n");
} virtual ~Derivel()
{
printf("Destructor derivel.\n");
}
}; // main
int _tmain(int argc, _TCHAR* argv[])
{
Derivel *a = new Derivel();
delete a; system("pause");
return ;
}
输出结果:
Constructor base.
Constructor base1.
Constructor derivel.
Destructor derivel.
Destructor base1.
Destructor base.
C++ 面向对象的三个特点--继承与封装(二)的更多相关文章
- C++ 面向对象的三个特点--继承与封装(一)
面试的时候经常会有很多概念性的东西,许久不用都会很生疏,特意整理一下方便自己以后不记得了可以查看一下,也顺便帮助自己复习一下. 概念 继承是面向对象程序设计的一个重要特性,它允许在既有类的基础上创建新 ...
- python面向对象(三)之继承
继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- 关于JS面向对象、设计模式、以及继承的问题总结
1.对象:JS中万物皆对象,它是一个泛指 类:对象的具体的细分 (物以类聚,人与群分.具有相同属性和方法的实例的一个集合总称) 实例:某一个类别中具体的一个事物 对象是一个抽象的概念,类似于我们的自然 ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- 第三十篇 面向对象的三大特性之继承 supre()
继承 一 .什么是继承? 类的继承跟现实生活中的父.子.孙子.重孙子的继承关系一样,父类又称基类. Python中类的继承分为:单继承 和 多继承. # 定义父类 class ParentClass ...
- python 面向对象专题(三):继承
目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生类,A类就称为父类,超类,基类 种 ...
- 荒芜的周六-PHP之面向对象(三)
hi 又是开森的周六了.积攒的两周的衣服,终于是差不多洗完了.大下午的才来学点东西~~ 1.PHP面向对象(三) 四.OOP的高级实践 4.3 Static-静态成员 <?phpdate_def ...
- OOP三个基本特征:封装、继承、多态
面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类 ...
随机推荐
- S1700
- What's New in iOS9 iOS9功能改进
What's New in iOS9 This article summarizes the key developer-related features introduced in iOS 9, w ...
- php生成随机密码(php自定义函数)转自先锋教程网
php生成随机密码(php自定义函数) 时间:2015-12-16 20:43:49来源:网络 导读:php随机密码的生成代码,使用php自定义函数生成指定长度的随机密码,密码规则为小写字母与数字的随 ...
- 无插件纯Web HTML5 3D机房 终结篇(新增资产管理、动环监控等内容)
原本以为这次的机房资产管理项目告一段落,可以歇一歇,哥还是太天真了.我们伟大的甲方又拿下了第二期的项目,誓把哥的才华发挥到极致啊.国庆长假也没正经休息几天,硬是给人折腾出了个demo,加上了容量管理. ...
- Android应用中使用及实现系统“分享”接口
为了应用的推广.传播,很多的应用中都有“分享”功能,一个按钮,点击后会出现短信.微博等等一切实现了分享功能的应用列表.这一篇文章主要介绍怎么调用分享功能和怎么实现分享接口让自己应用出现分享列表中.An ...
- MyBatis知多少(1)
SQL (Structured Query Language,结构化查询语言)己经存在很长一段时间了.自从第一次提出“数据可以被规范化为一组相互关联的表”这样的思想以来,已经超过35年了. 从那时起, ...
- [Linux] zip 与 unzip 命令
zip zip 命令基本格式为: zip options archive inpath inpath ... archive 是 .zip 文件(新的或已经存在的). inpath 是需要打包的目录或 ...
- typeof与GetType
typeof: The typeof operator is used to obtain the System.Type object for a type. 运算符,获得某一类型的 System. ...
- 【转载】Debian 6安装小记
转载自:http://unix-cd.com/vc/www/22/2011-06/18022.html 今天终于装上了 debian6,代号叫squeeze是吧?前几天的时候在Microhu’s Bl ...
- Android上的事件流操作数据库
最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在Android端实现一个. 根据文章的介绍,将每次数据的变更事件,像是插入,删除或者更新等,记为一个不可变的事件,让数 ...