谈谈C++私有继承
很多C++程序猿从来没用过私有继承来设计他的类。的确,假设是本该用私有继承的地方却用了公有继承。对程序的功能的实现并无影响。
但这样的误用是一种错位的描写叙述。会引起阅读者的误解,甚至会引起类的使用者的茫然。当我们在写一个类的声明的时候,实际上是在做一个意图的设计。而设计者须要的恰恰是精确描写叙述。
- 私有继承的弦外之音
要解释私有继承。我们先来看看共同拥有继承,好做个比較。
公有继承,本质上就是 is-a 的关系。如。描写叙述吉普车是一种车。那么能够进行下面的设计:
class Car
{
}; class Jeep : public Car
{
}
私有继承,子类仅仅能在类内部使用父类的功能,而不能将父类的功能以接口的形式开放给外部,也就是说。子类的对象无法直接使用到父类的功能接口。所以。私有继承的涵义就成了:子类能够借助父类的功能来实现自己的功能。
这就是典型的has-a 的关系。
class Engine
{
public:
void Run();
}; class Car : private Engine
{
public:
void Drive()
{
// let engine go!
Run();
}
};
在关系描写叙述上,等同于组合【严格意义上不能说是等同,由于毕竟私有继承的方式还能够同意继承类使用基类的protected成员,而通过组合方式的是无法使用被组合的类的protected成员的】。如:
class Car
{
...
private:
Engine m_engine;
}
- 私有继承VS组合
私有继承带来过多的程序开销,而组合却是短平快,所以一般来说。设计者想描写叙述Has-A的关系时。组合方式是首选的。
但下面两种方式则必须使用私有继承:
- A类须要使用B类的protected成员函数来实现自己的功能时
- A类须要重写B类的虚函数时
谈谈C++私有继承的更多相关文章
- has-a关系——多重私有继承
#ifndef _STUDENT_H_ #define _STUDENT_H_ #include <iostream> #include <string> #include & ...
- Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承
条款40 通过分层来体现"有一个"或"用...来实现" 使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layeri ...
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
各种继承方式: 特征 公有继承 保护继承 私有继承 公有成员变为 派生类的公有成员 派生类的保护成员 派生类的私有成员 保护成员变为 派生类的保护成员 派生类的保护成员 派生类的私有成员 私有成员变为 ...
- C++ 中私有继承、保护继承与公有继承
区别 下面通过一个示例来介绍三种继承的区别. 定义一个基类(假设为一个快退休的富豪): class RichMan { public: RichMan(); ~RichMan(); int m_com ...
- C++中公有继承、保护继承、私有继承的区别
公有继承时基类中各成员属性保持不变,基类中private成员被隐藏.派生类的成员只能访问基类中的public/protected成员,而不能访问private成员:派生类的对象只能访问基类中的publ ...
- 《C++ Primer Plus》14.2 私有继承 学习笔记
C++(除了成员变量之外)还有另一种实现has-a关系的途径——私有继承.使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员.(如果使用保护继承,基类的公有成员和保护成员都将称为派生类的保 ...
- C++公有继承、保护继承和私有继承
C++中的继承方式有: public.private.protected三种(它们直接影响到派生类的成员.及其对象对基类成员访问的规则). (1)public(公有继承):继承时保持基类中各成员属性不 ...
- c++继承详解:共有(public)继承,私有继承(private)继承,保护(protected)继承
公有继承(public)继承.私有继承(private).保护继承(protected)是常用的三种继承方式. 1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时 ...
- C++之共有继承、保护继承、私有继承
1.封装,public,private作用就是这个目的. 类外只能访问public成员而不能方位private成员: private成员只能被类成员和友元访问: 2.继承,protected的作用就是 ...
随机推荐
- Unexpected token d in JSON at position 669 while parsing near '...ct-mode":"^6.0.2"}
问题 在安装 babel 的时候,遇到问题 Unexpected token d in JSON at position 669 while parsing near '...ct-mode" ...
- Ubuntu环境修改IP地址方法
ubuntu环境修改IP地址方法和CentOS系统修改方法不太一样.ubuntu系统修改IP地址方法如下: 编辑/etc/network/interfaces,增加以下内容: auto eth0 if ...
- 第二次 Ubuntu16.04 vi编辑器的方向键和退格问题
新安装ubuntu后,好多人可能都碰到过这样的问题,vi对文件进行编辑时,上下左右键变成了ABDC,退格键也不管用. 解决办法其实也很简单,首先卸载掉旧的vim-common. apt-get rem ...
- nginx虚拟主机配置实践
1.配置基于域名的虚拟主机 [root@web01 html]# egrep -v "#|^$" /application/nginx/conf/nginx.conf.defaul ...
- assert.deepEqual()
assert.deepEqual(actual, expected[, message]) 深度比较 actual 和 expected 参数,使用比较运算符(==)比较原始值. 只考虑可枚举的&qu ...
- mac 解决mysql启动不了
mac升级了mysql,没有替换原来的链接的情况下, 启动mysql restart 会失败 解决方法,找到mysql真正的安装目录 mysql.server start
- 安装nvm 切换nodejs版本
删除已安装的nodejs--------------------------------------------------------------- #查看已经安装在全局的模块,以便删除这些全局模块 ...
- [bzoj3668][Noi2014][起床困难综合症] (按位贪心)
Description 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过研究相关文献,他找 ...
- String类的概述和构造方法
StringDemo.java /* * String:字符串类 * 由多个字符组成的一串数据 * 字符串其本质就是一个字符数组 * * 构造方法: * String(String original) ...
- 动态创建div(鼠标放上显示二维码)
最近的微信大行其道.各个网站上都给出的微信验证码,进行手机扫描加入. 怎么创建类似与点击鼠标弹出一个浮动的div显示二维码的这种效果. 1.首先制作好这样的图片,写css样式 <style ty ...