C++继承

在封装的过程中,我们发现有很多地方有问题,比如我们在封装Windows API 的过程中,每个窗口都有各自的消息处理,而我们封装时不同的窗口要针对不同的消息而编写不同的消息处理函数,不可能所有窗口对于某些消息都进行相同的处理,所以在面向对象的程序设计中,提供了一种新的方式——继承与派生;

在c++中将继承的一方称作派生类或者子类,将被继承的一方叫做基类或者父类继承的基本格式如下(CB 继承CA):

class CA
{
public:
    CA();
    ~CA();
}

class CB : public CA
{
public:
    CB();
    ~CB();
}

派生类中前面相应大小空间的内存保存的是基类的内容,而后面的部分保存的是派生类的内容,这样派生类就可以拥有基类的所有成员,而不必重写代码达到了代码重用的目的。在设计中一般将类的共性提取出来作为基类,而将不同的部分从基类派生,作为每个类的特性,对于共性的内容我们只需要在基类中编写,而在派生类中直接使用。

下面我们来探讨一下,基类与派生类中构造与析构的调用关系,通过写下面一个简单的小例子:

class CA
{
public:
	CA(){ cout <<"CA()"<<endl; }
	~CA(){ cout <<"~CA()" << endl; }
};

class CB : public CA
{
public:
	CB(){ cout <<"CB()" << endl; }
	~CB(){ cout <<"~CB()" << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
	CB objB;
	return 0;
}

最终的结果是先调用基类的构造函数在调用派生类的构造函数,而对于析构的调用顺序正好相反,先调用派生类在调用基类:

对于继承来说有三种:共有继承、私有继承以及保护继承,继承的方式不同,派生类对于基类的各种不同属性之间成员的访问权限不同,下面再给出一个表格用以说明这个问题:

通过这个表我们可以总结出一下几点:

1)私有成员在任何情况下都不能被派生类访问;

2)公有继承下其他基类成员在派生类中的访问属性不变;

3)私有继承下其他基类成员在派生类中全部变为私有;

4)保护继承下其他类成员在派生类中全部变为保护属性;

从这个表中我们可以看出,私有继承与保护继承对于基类的访问属性完全相同,那么它们有何区别呢?保护成员的访问情况与私有相同,即类的保护成员在类内可以访问在类外不能访问,它们二者的区别在这个表中确实没有体现出来,主要的区别可以在下一层的继承中体现比如有三个类继承关系为CC->CB->CA,继承类型分别为,我们知道基类的非私有成员在保护继承下公有的变为保护,保护的仍然为保护,而私有继承则是将所有都变为私有,他们之间如果都是保护继承的方式,那么CA中的其他成员在CB中都变为保护类型那么在CC中仍然能够访问到CA的成员;当他们之间都是以私有继承的方式,那么CA中的成员在CB中都为私有,在CC中就不能访问CA中的成员,所以在一般情况下,我们将基类的数据成员声明为保护类型,这样既起到了封装的作用,又方便派生类的访问;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏zlmai的专栏

C++中关于几种输入方法的总结

C++中有很多关于输入的函数,比如cin、cin.get()、cin.getline()、getline()、gets()等等,很容易搞混,下面分别总结下,欢迎...

2395
来自专栏吴裕超

exports 和 module.exports 的区别

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.e...

2924
来自专栏云霄雨霁

Java虚拟机--Class文件结构

1745
来自专栏前端知识分享

第193天:js---Math+Error+Number+Object总结

762
来自专栏乐百川的学习频道

Python学习笔记 输入输出

str和repr内置函数 在介绍Python的输入输出之前,我们先来介绍两个内置函数,str()和repr(),它们都用来输出对象的字符串形式。不过它们之间有一...

3328
来自专栏小狼的世界

This关键字的一些更新的理解

this是Javascript中一个非常重要的关键字,正确的使用this能够使我们的程序效率得到提升。之前,对于this的认识还存在一些误区,今天看了一篇文章之...

765
来自专栏LEo的网络日志

python技巧分享(七)

3398
来自专栏栗霖积跬步之旅

1.7停止线程

线程停止:在线程处理完任务之前,停掉正在做的操作,也就是放弃当前操作。 在java中有三种方法可以实现线程的停止: 使用退出标志,使线程正常退出,也就是当run...

2070
来自专栏Pulsar-V

GTK基础操作类

1 类型定义 整数类型:gint8、guint8、gint16、guint16、gint31、guint32、gint64、guint64。不是所有的平台都提...

2745
来自专栏LuckQI

学习Java基础知识,打通面试关七

941

扫码关注云+社区

领取腾讯云代金券