C++ 编程规范-private继承

继承基础知识

延伸:
简单地说下C++类的3种继承方式,分别是public继承,protected继承,private继承。
最常用的还是public继承。class默认的是private继承,它的member如果没写权限也是默认
private。struct则相反,默认的是public继承。结合下面的图示和代码,对C++的继承就有了比较清晰的认识了。
C++ 编程规范-private继承_第1张图片
private成员变量:

  • 类内可以访问;
  • 实例化对象不可以访问,如果想访问,需要在类内定义可以访问的成员函数;
  • 派生类不可以访问;

protect成员变量:

  • 类内可以访问;
  • 实例化对象不可以访问;
  • 派生类类内可以访问(三种继承方式都可以在类内访问);

public成员变量

  • 都可以访问;

1. 父类引用子类对象 & 父类指针绑定子类对象

public继承的时候,以下可行。也就是只有is-a关系的时候,才能采用父类引用绑定子类对象以及父类指针绑定子类对象。

class Human
{
	Human() {}
	virtual ~Human() {}  // 父类应该有个虚析构函数
}
class man : public Human
{
	
}

man myman;
Human& myhuman = myman;  // 父类引用绑定子类对象
Human* myhuman = new man();  //父类指针指向子类对象

private继承,其实是一种组合关系,确切的说是组合关系中的is-implemented-in-terms-of关系。例如根据Human类实现Man类

  • **一般优先考虑使用组合关系,**只有在一些比较特殊的情况下,比如牵扯一些protected成员,private成员,虚函数等,才考虑用private继承来表达组合关系。
  • 类似> https://blog.csdn.net/lcb_coconut/article/details/115208586文章中关于is-implemented-in-terms-of关系,采用multimap对象作为私有成员变量,然后调用multimap中的函数来实现smap的某些方法。
  • 本篇中采用私有继承,将所有Timer类中的成员变成子类的私有成员,然后用来实现子类的某些方法。
class Timer
{
	Timer(int time) {}
	virtual ~Timer() {}  // 父类应该有个虚析构函数
	virtual void CallBack() {}  // 到time时间后会被调用的虚函数
}
class MsgQueue: private Timer
{
private:  // 采用private,避免CallBack被用户误用
	virtual void CallBack() {}

你可能感兴趣的:(编程之美C++,c++)