读书人

private承继

发布时间: 2013-09-05 16:02:07 作者: rapoo

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 继承
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

width 也继承了,整个基类的所有非静态成员都继承了。

如果width也继承了,那width是private_cube类的private, public 还是protected成员?

你这个问题问的很有误导性。
最自然的貌似是认为 width 是 private_cube 的 private 成员;
这时候你可以继续问,既然这样,为毛在 private_cube 的函数里面访问不了 width。
因此 c++ 区分 class membership 和 access control 两个概念。
通常所说的 a 是 class X 的 private member 实际上是指
(1) a is a member of class X.
(2) private access control is applied on a, i.e., cannot be accessed outside X.
所以,对你问题的正确回答是,
(1) width is a member of private_cube。
(2) but its accessibility is neither public, protected nor private. it is simply inaccessible in private_cube.

但是,通过类private_cube的成员函数public_display实现了访问width?

是的,因为在 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,所以出编译错误。

读书人网 >C++

热点推荐