[关闭]
@lishuhuakai 2016-11-04T16:28:32.000000Z 字数 937 阅读 1440

CPP常识 03 -- 继承那些事情

cpp


我不会大扯什么原理,没意思,我这里只是记录一下规则而已,方便以后的查看.

规则

公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。

父类的私有成员变量和函数在子类中不可访问,同时父类中的保护和公有的成员变量和属性性质不变地转移到子类中.

父类的私有成员变量和函数在子类中不可访问,同时父类的保护和公有的成员变量和函数变成了子类的私有成员变量和函数.

父类的私有成员变量和函数在子类中不可访问,同时父类的保护和公有的成员变量和函数变成了子类的保护成员变量和函数.

凡事都有例外

一个有意思的问题

根据cpp的继承规则,如果子类以private的形式继承父类的话:

我这里有一个问题:

  1. class A : boost::noncopyable
  2. {
  3. public:
  4. A () {}
  5. }
  6. class B : A
  7. {
  8. public:
  9. B() {}
  10. }

我的疑问是B类能够构造吗?我们来分析一下,A类以private的形式继承noncopyable,这意味着,noncopyable的构造函数和析构函数变成了A中的私有函数,是吧!

这样以来,B类构造的时候要调用A的构造函数,既然A的构造函数变成了private,那么B就不能构造了,不是吗?

推理似乎很漂亮,但是很遗憾,是错的,虽然很违反我们的直觉.

effective c++提到过这个问题的解释,我在这里摘抄一下:

在子类对象(derived class)对象的base class构造期间,该子类对象的类型是父类(base calss),而不是子类(derived class).在子类对象析构的时候这一条也成立.

至于为什么会有这么违反直觉的事情发生,可以查看effective c++的条款9:绝不在构造和析构过程中调用virtual函数.

结果显而易见,在B类调用A类的构造函数时,B类仍然是A类,所以可以访问noncopyable的构造函数.

好吧,cpp的坑可真多呢.

总结

所以前面的规则对于构造函数,析构函数什么的统统失效.

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注