【发布时间】:2013-04-11 14:56:31
【问题描述】:
我使用的是 Win8 VC++2012。
上面的代码是为了说明子类B在任何情况下都不能访问A::a。我也不能更改 A::a 但 A::b 和 A::c 的访问属性。
所以A::c并没有从A继承到B。但是sizeof(A)和sizeof(B)分别是12和24,也就是说A::a DO占用了B中的内存。
- B 怎么可能将 A::a 存储在它的内存中而永远无法访问它?
- C++ Primer 一书说,我们可以恢复基类成员的访问属性,但不能改变它。这里我的代码显示我可以在 B 中将 A::b 的访问属性从受保护更改为公开。为什么?
代码如下:
#include <iostream>
using namespace std;
class A
{
private:
int a;
protected:
int b;
public:
int c;
A(int a, int b, int c): a(a), b(b), c(c)
{
cout << "A: ";
cout << a << " ";
cout << b << " ";
cout << c << endl;
}
};
class B: protected A
{
private:
int d;
protected:
int e;
//using A::a; COMPILE ERROR
public:
int f;
//A::a; COMPILE ERROR
using A::c; //RESTORE A::c public access
A::b; // change A::b from protected to public
B(int d, int e, int f): A(d, e, f), d(d), e(e), f(f)
{
cout << "B\n";
//cout << a << endl; COMPILE ERROR
cout << b << " ";
cout << c << " ";
cout << d << " ";
cout << e << " ";
cout << f << endl;
}
};
int main()
{
A a(1,2,3);
B b(4,5,6);
cout << "sizeof(A)=" << sizeof(A) << endl; //OUTPUT 12
cout << "sizeof(B)=" << sizeof(B) << endl; //OUTPUT 24
return 0;
}
【问题讨论】:
-
不要相信
sizeof会按您的预期工作。 -
另外,你期待什么?
private是private。
标签: c++ inheritance private