条款39、明智而小心的使用private继承

背景

这篇主要介绍了private继承的使用方法,private继承意味着:根据某物实现,这里注意private继承和public继承完全不是一个概念,private继承只是表示子类要利用父类的一些函数而已,仅此而已。实际使用中也可以发现,父类指针和引用根本没法用子类的参数, 换句话说,编译器不会自动将一个派生类对象转换成一个基类对象,此外基类中的所有成员在派生类中都编程private属性,派生类对象无法访问。

1、如果类之间的关系是private继承,则:a:编译器不会自动将一个派生类对象转换成一个基类对象 b: 基类中的所有成员在派生类中都编程private属性,派生类对象无法访问
2、private表现出的关系是“根据某物实现出”,它继承的是实现而非接口
乍看很奇怪,实现都继承了怎么接口都不继承。这样理解,我们派生类需要利用private 基类中的一些成员实现某些东西,但是成员经过继承后变成了private属性,用户是无法通过接口访问它的,所以只是继承了实现而忽略了接口。
3、private继承主要用于:当两个类不存在“is-a”的关系,其中一个需要访问另一个的protected成员,或需要重新定义一个或多个virtual函数
这句话这么理解:现有两个类并非“is-a”关系,类D需要用类B的一些成员去实现它,而且我要用到的这些成员往往是类B的protected成员或者是虚函数。但是我只是需要这些成员去实现我的类D,并不给用户提供接口能直接访问类B的这些成员,这时候就应该用private继承。

class Person{...};
class Student:private Person{...};
void eat(const Person &p);
Person p;
Student s;
eat(p);//正确
eat(s);//错误

当希望override它的virtual函数的时候

当我们想利用某个基类的虚函数的时候,比如Widget class 想利用Timer class的一个函数,但是两个类又不是is-a关系。

class Timer 
{
public:
	virtual void onTick() const;
}
方法一、private继承
class Widget: private Timer
{
public:
	void Tick(){onTick();};
private:
	virtual void onTick() const;//重新定义,或者直接利用
}
方法二、组合 (推荐)
class Widget
{
private:
	class WidgetTimer: public Timer
	{
	public:
		virtual void onTick() const;
	};
	WidgetTimer timer;
}

为什么推荐方法二?首先如果Widget是一个基类,后面还有人要继承,那么子类可以重新定义onTick()函数,但是这个是你不想的,所以方法二可以解决这个困扰,第二,Widget的编译依存降低,我们把WidgetTimer这个类移到外面某个文件,把成员变量timer改成指针,那么文件只要申明一个WidgetTimer就可以了,所以不会需要include "Timer.h"了,依赖降到最小。

当希望访问protected接口的时候


class Base
{
protected:
    void BTest(){cout << "I'm Base" << endl;}
};
class Derived : private Base
{
public:
    void DTest() {cout << "I'm Derived  " ;BTest();}

这里记住,基类的私有成员,在子类是无法调用的,只有protected,public可以,而这里又不想用public, 那只有用private继承

参考

  • https://blog.csdn.net/u014465639/article/details/72860004
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值