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

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

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

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

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

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

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

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

例:

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. 2dtoolkit获取sprite像素大小的方法

    获取sprite像素的方法 Vector2 GetPixelSize(tk2dSpriteDefinition def){ ].x; ].y; // Calculate dimensions in p ...

  2. 解决在IE下LABEL中IMG图片无法选中RADIO的几个方法

    转http://www.cnblogs.com/chenxianbin89/archive/2012/11/25/2787258.html . 方法三,THML代码控制: 在IMG中加一个属性,dis ...

  3. js常见怪异

    1.隐式转换为布尔:"truthy"和"falsy" 当 JavaScript 需要一个布尔值时(例如:if 语句),任何值都可以被使用. 最终这些值将被转换为 ...

  4. Adobe Flash Builder 4.6破解方法

    http://hi.baidu.com/cm186man/blog/item/148658ce557c0323b700c853.html 1.到Adobe官网下载FlashBuilder 4.6,有简 ...

  5. C++输入输出

    i. C++如何输入一行,按回车键结束 #include <sstream>1 getline(cin, line); istringstream input(line); ii. C++ ...

  6. Visual Studio 2010 简体中文旗舰、专业版(MSDN原版下载)

    Visual Studio 2010 简体中文旗舰.专业版(MSDN原版下载)(Visual Studio 2010 ultimate professional x86 dvd)2010[光盘镜像]- ...

  7. UITextField-secureTextEntry

    1.UITextFiled的密文输入   secureTextEntry  安全文本输入  secure:安全  Entry:入口

  8. sql server 脚本创建数据库邮件

    sql server 脚本创建数据库邮件代码: --脚本创建数据库邮件 --1.开启数据库邮件 RECONFIGURE WITH OVERRIDE GO RECONFIGURE WITH OVERRI ...

  9. SQL Server中的事务日志管理(2/9):事务日志架构概述

    当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...

  10. 邮箱mail 发送类 ASP.NET C#

    没有牛B的设计模式,代码精练精练实用,功能齐全,调用简单 ..全全完完为码农考虑 MailSmtp ms = new MailSmtp("smtp.qq.com","12 ...