我正在使用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中的内存。
以下是代码:
#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;
}
答案 0 :(得分:6)
儿童继承父母的私人成员,但他们无法访问它们。要访问它们protected
class A
{
protected: // <<------------ make `a` as protected in parent
int a;
答案 1 :(得分:1)
使用继承时,您将创建基类的实例以及派生类的实例。当您实例化派生类时,即使派生类无法访问它们,也会构造基类内的所有成员。
如果您需要该成员在基类中是私有的,但您仍希望在派生类中访问它。在基类中创建一个受保护的访问者,使您可以访问私有成员。
protected:
int &geta() { return a; }
答案 2 :(得分:1)
你是说吗?所以A :: c不是从A到B继承
所以A :: a不是从A到B继承
但即便如此,它确实是遗传的。它不是直接访问。但是,B
仍会有a
。
为什么这有必要?因为A
中的公共方法可以设置或获取a
的值。这些函数可以间接授予对其自己的a
的访问权限。< / p>
例如
class A {
private:
int a; // a is private
public:
void set_a(int i) {a = i;}
};
class B : protected A {
public:
using A::set_a; // we bring set_a to public access
};
int main() {
B b;
b.set_a(2); // change b.a indirectly
b.a = 2; // Error
}
答案 3 :(得分:0)
我看不出问题所在:
B是A,这就是为什么a属性会占用一些空间,即使B无法访问它。
如果有一个公共方法geta()返回a,如果a不在B中,它怎么能返回?