private继承
如下代码:
class cube
{
public:
cube(int j = 0):width(j) {}
void display_width() { cout << "width:" << width << endl; }
private:
int width;
};
class private_cube: private cube
{
public:
void public_display()
{
display_width();
}
};
int main()
{
private_cube private_c2;
private_c2.public_display();
return 0;
}
输出:width:0
问题:因为是private继承,private_cube类应该只继承了cube的成员函数display_width(),而没有继承成员变量width,但是为什么用private_cube的对象调用public_display()接口可以输出width的值呢? class 继承
[解决办法]
是的,因为在 private 继承下,基类的 public 和 protected 成员属于 private access control.
我这么说也许更好理解一些。从 accessibility 的角度看,所有成员,首先分为两类
(1) accessible.
(2) inaccessible.
对于 (1),继续细分为 public, protected, private;
对于 (2),就没有下文了,都访问不了了,还有什么访问控制可言?
从 private_cube :: public_display 里面看,cube :: display_width
(a) is accessible and
(b) its access control is private.
从 cube::display_width 里面看,cube::width
(i) is accessible and
(ii) its access control is private.
在两种情况下,都没有出现访问控制的问题,所以可以编译。
但是在 private_cube 的成员函数中,看 cube::width,则是
[1] it is inaccessible.
[2] that's it. the access control concept (public/protected/private) does not even apply.
鉴于情况如此复杂,所以标准还有一个概念,叫 access path,所以
private_cube::public_display -> cube::display_width -> cube::width 是一条 valid access path.
而
private_cube::public_display -> cube::width 则是 invalid access path,所以出编译错误。