1

我正在使用 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 中的内存。

  1. B 如何将 A::a 存储在它的内存中而永远无法访问它?
  2. 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;
}
4

4 回答 4

6

子级继承父级的私有成员,但不能访问它们。访问使他们protected

class A
{
protected: // <<------------ make `a` as protected in parent
    int a;
于 2013-04-18T13:13:06.690 回答
1

当您使用继承时,您正在创建基类的实例以及派生类的实例。基类内部的所有成员都是在您实例化派生类时构造的,即使派生类无法访问它们。

如果您需要成员在基类中是私有的,但您仍想在派生类中访问它。在基类中创建一个受保护的访问器,让您可以访问私有成员。

 protected:    
 int &geta() { return a; }
于 2013-04-18T13:13:50.270 回答
1

所以 A::c 不是从 A 继承到 B

你的意思

所以 A::a 不是从 A 继承到 B

但即便如此,它确实是继承的。它只是不能直接访问。但是B仍然会有一个a.

为什么这是必要的?因为您可以拥有可以A设置或获取a. a这些函数可以让B间接访问它自己的。

例如

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
}
于 2013-04-18T13:14:39.157 回答
0

我不明白问题是什么:

B 是 A,这就是为什么即使 B 无法访问它,a 属性也会占用一些空间。

如果有一个公共方法 geta() 返回 a,如果 a 不在 B 中,它怎么能返回 a?

于 2013-04-18T13:16:41.093 回答