C ++ Child类不能从Father类继承私有成员?

时间:2013-04-18 13:09:30

标签: c++ inheritance private

我正在使用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的访问属性从protected更改为public。为什么?
  3. 以下是代码:

    #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 个答案:

答案 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中,它怎么能返回?