@lishuhuakai
2016-11-05T00:28:32.000000Z
字数 937
阅读 1588
cpp
我不会大扯什么原理,没意思,我这里只是记录一下规则而已,方便以后的查看.
公有继承(public
)、私有继承(private
)、保护继承(protected
)是常用的三种继承方式。
public
)父类的私有成员变量和函数在子类中不可访问,同时父类中的保护和公有的成员变量和属性性质不变地转移到子类中.
private
)父类的私有成员变量和函数在子类中不可访问,同时父类的保护和公有的成员变量和函数变成了子类的私有成员变量和函数.
父类的私有成员变量和函数在子类中不可访问,同时父类的保护和公有的成员变量和函数变成了子类的保护成员变量和函数.
根据cpp
的继承规则,如果子类以private
的形式继承父类的话:
我这里有一个问题:
class A : boost::noncopyable
{
public:
A () {}
}
class B : A
{
public:
B() {}
}
我的疑问是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
的坑可真多呢.
所以前面的规则对于构造函数,析构函数什么的统统失效.