这两段代码有什么区别吗?

时间:2010-06-13 18:31:17

标签: c++ inheritance

#include<stdio.h>

class A {public: int a; };
class B: public A {private: int a;};

int main(){
    B b;
    printf("%d", b.a);
    return 0;
}

#include<stdio.h>

class A {public: int a; };
class B: private A {};

int main(){
    B b;
    printf("%d", b.a);
    return 0;
}

我问,因为我得到了不同的错误:

error: 'int B::a' is private

error: 'int A::a' is inaccessible

除了错误可能揭示的内容之外,这两段代码的行为是否有任何区别?

2 个答案:

答案 0 :(得分:2)

他们是不同的。在第一个实例中,您将创建变量“a”的两个实例。一个在基类中,一个在子类中。在这两个示例中,您都无法访问变量。

如果你有:

A *pA = new B();
pA->a; // This will refer to A::a, which is allowed as it was defined public.

B *pB = new B();
pB->a; // This will refer to B::a, which you can't get access to.

如果你想隐藏对'a'变量的访问,我建议使用私有继承的第二个例子。请注意,私有继承也会使基类中定义的任何函数变为私有。

答案 1 :(得分:2)

在您的第一个示例中,类B有两个名为a的成员,它从类A继承的成员以及它自己定义的成员。因此,B类的对象最终会变大,您仍然可以明确地访问类A的{​​{1}}成员:

a