顺着上一篇的内容,我们继续来了解继承的基本知识。

  • 派生类的构造函数和析构函数

派生类继承了基类的成员,但是不能继承基类的构造函数和析构函数,首先,我们了解构造函数和析构函数的执行顺序是当我们创建一个派生类的对象是,先执行的是基类的构造函数,然后是派生类的构造函数。析构函数则正好相反,先执行派生类的析构函数,再执行基类的析构函数。

  • 派生类构造函数和析构函数的构造规则

当基类的构造函数没有参数的时,或者没有显示的定义构造函数时,派生类可以不向基类传递参数,甚至可以不定义构造函数。但是当基类带有含参数的构造函数的时候,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。

派生类构造函数的定义格式:

派生类名(参数总表) : 基类名(参数表)

其中基类的构造函数参数通常来源于派生类构造函数的参数总表,也可以设置为常数值。

例:

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++ 面向对象的三个特点--继承与封装(二)的更多相关文章

  1. C++ 面向对象的三个特点--继承与封装(一)

    面试的时候经常会有很多概念性的东西,许久不用都会很生疏,特意整理一下方便自己以后不记得了可以查看一下,也顺便帮助自己复习一下. 概念 继承是面向对象程序设计的一个重要特性,它允许在既有类的基础上创建新 ...

  2. python面向对象(三)之继承

    继承 介绍 继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.继承即常说的is-a关系.子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承 ...

  3. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  4. 关于JS面向对象、设计模式、以及继承的问题总结

    1.对象:JS中万物皆对象,它是一个泛指 类:对象的具体的细分 (物以类聚,人与群分.具有相同属性和方法的实例的一个集合总称) 实例:某一个类别中具体的一个事物 对象是一个抽象的概念,类似于我们的自然 ...

  5. javascript面向对象系列第三篇——实现继承的3种形式

    × 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...

  6. 第三十篇 面向对象的三大特性之继承 supre()

    继承 一 .什么是继承? 类的继承跟现实生活中的父.子.孙子.重孙子的继承关系一样,父类又称基类. Python中类的继承分为:单继承 和  多继承. # 定义父类 class ParentClass ...

  7. python 面向对象专题(三):继承

    目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生类,A类就称为父类,超类,基类 种 ...

  8. 荒芜的周六-PHP之面向对象(三)

    hi 又是开森的周六了.积攒的两周的衣服,终于是差不多洗完了.大下午的才来学点东西~~ 1.PHP面向对象(三) 四.OOP的高级实践 4.3 Static-静态成员 <?phpdate_def ...

  9. OOP三个基本特征:封装、继承、多态

    面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类 ...

随机推荐

  1. 10个你必须掌握的超酷VI命令技巧

    摘要:大部分Linux开发者对vi命令相当熟悉,可是遗憾的是,大部分开发者都只能掌握一些最常用的Linux vi命令,下面介绍的10个vi命令虽然很多不为人知,但是在实际应用中又能让你大大提高效率. ...

  2. Java IO 之 OutputStream源码

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  3. 电商O2O-11种最佳运营模式

    免费模式,是在这种矛盾下应运而生的新型模式.免费模式在未来的几年中,将会不断的渗透到各个行业中,这不单单是加速了行业内部的洗牌速度,更是加速了行业之间的洗牌速度. 未来,免费模式会让行业之间的界限变得 ...

  4. Go目录

    1. Go语言获取项目当前路径 2. Go语言TCP/UDP Socket编程 3. Go语言实现HashSet

  5. c# double保留2位小数

    / (endIndex - startIndex); interval = Math.Round(interval , );

  6. (转)在低版本的SDK里使用高版本函数@SuppressLint("NewApi") or @TargetApi?

    @SuppressLint 和 @TargetApi达到的效果是一样的,相对于SuppressLint ,TargetApi会根据函数里使用的API,严格匹配SDK版本,给出编译错误,但是Suppre ...

  7. jquery---基本标签

    你觉得 jquery 有哪些好处? jQuery 是轻量级的 javascript 框架 强大的选择器 出色的 DOM 操作的封装 可靠的事件处理机制 完善的 ajax 封装 出色的浏览器的兼容性 支 ...

  8. 【转】Linux下svn常用指令

    转自: http://blog.csdn.net/myarrow/article/details/8110858 1.将文件checkout到本地目录svn checkout path(path是服务 ...

  9. rails从4.0.2降到3.2.9

    初学ruby和rails,想和教程同步,把rails的版本降下来.从4.0.2降到3.2.9 [lucas@lucas ~]$ rails -v Rails 4.0.2 尝试了 sudo gem un ...

  10. 【转载】让windows使用linux系统的命令

    转载自:http://blog.chinaunix.net/uid-28336510-id-3824903.html 1.下载GnuWin32,GnuWin32的安装文件(GetGnuWin32-0. ...