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三个基本特征:封装、继承、多态
面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类 ...
随机推荐
- 在线程池使用Callable和Runnable的区别以及如何关闭线程
一.区别总结: Callable定义的方法是call,而Runnable定义的方法是run. Callable的call方法可以有返回值,而Runnable的run方法不能有返回值,这是核心区别. C ...
- [转]SharePoint开发中可能用到的各种Context(上下文)
SharePoint是一个B/S结构的产品,所以在开发过程中会使用到各种各样的上下文(Context)信息,借此机会来总结一下.特别是Javascript的Ctx非常实用,这里记录一下! 一.Http ...
- EFW框架源代码版本升级记录说明
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
- VPN有什么用?(转载)
VPN有什么用?转载自:http://www.chinaz.com/web/2012/0320/240819.shtml 当你非常非常想访问一个国外的网站,而这个网站被防火墙屏蔽的时候,你应该怎么做呢 ...
- 【转】ORATOP工具使用说明
文章转自:http://lintzyuan.blogspot.jp/2014/07/oratop.html ORATOP 前言:隨著PC Server的規格及速度愈來愈快,大多數的公司摒棄大型主機 ...
- 【转载】CSS 盒子模型
转处:http://www.cnblogs.com/sunyunh/archive/2012/09/01/2666841.html 说在Web世界里(特别是页面布局),Box Model无处不在.下面 ...
- 线程安全集合 ConcurrentDictionary<TKey, TValue> 类
ConcurrentDictionary<TKey, TValue> 类 [表示可由多个线程同时访问的键/值对的线程安全集合.] 支持 .NET Framework 4.0 及以上. 示例 ...
- 【原创】C#搭建足球赛事资料库与预测平台(4) 比赛信息数据表设计
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源C#彩票数据资料库系列文章总目录:[目录]C#搭建足球赛事资料库与预测平台与彩票数据分析目录 本篇文章开始将逐步介 ...
- oc调用rest api
无需其他类库 1: - (IBAction)callapi:(id)sender { 2: NSURL *url=[NSURL URLWithString:@"http://..." ...
- jQuery相册预览简单实现(附源码)
1.CSS样式 <style type="text/css"> html,body,.viewer,.viewer .pic-list,.viewer .pic-lis ...