c++子类不能从父类继承私有成员

C ++ Child class cannot inherit private member from Father class?

本文关键字:成员 继承 父类 子类 不能 c++      更新时间:2023-10-16

我使用的是Win8 vc++ 2012。

上面的代码显示子类B在任何情况下都不能访问A:: A。也不能修改A:: A的访问属性,只能修改A::b和A::c。

所以A::c不是从A继承到B的,但是sizeof(A)和sizeof(B)分别是12和24,这意味着A:: A占用了B的内存

    B怎么能把A:: A存储在它的内存中,而永远不能访问它?
  1. c++入门书中说,我们可以恢复基类成员的访问属性,但不能改变它。这里我的代码显示,我可以在b中将A::b的访问属性从protected更改为public。

代码如下:

#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 << "Bn";
        //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;
}

子节点继承父节点的私有成员,但不能访问。将它们设为protected

class A
{
protected: // <<------------ make `a` as protected in parent
    int a;

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

你的意思是

所以A:: A不能从A继承到B

但即便如此,它也确实是遗传的。它只是不能直接访问。然而,B仍然有a

为什么这是必要的?因为你可以在A中有公共方法可以设置或获取a的值,这些函数可以间接地让B访问自己的a

例如

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
}

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

如果您需要成员在基类中为私有,但仍希望在派生类中访问它。在基类中创建一个受保护的访问器,使您能够访问私有成员。

 protected:    
 int &geta() { return a; }

我不知道是什么问题:

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

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