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

C++ 这两段代码有什么区别吗?,c++,inheritance,C++,Inheritance,除了错误可能揭示的内容外,这两段代码的行为是否有任何差异?它们是不同的。在第一个实例中,您正在创建变量“a”的两个实例。一个在基类中,一个在子类中。在这两个示例中,您都无法访问该变量 如果您有: error: 'int A::a' is inaccessible 如果您想隐藏对'a'变量的访问,我建议使用第二个示例,使用私有继承。请注意,私有继承也会使基类中定义的任何函数私有。在第一个示例中,类B有两个名为a的成员,一个是从类a继承的,另一个是它自己定义的。因此,类B的对象最终会变大,并且您仍

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

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

如果您有:

error: 'int A::a' is inaccessible

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

在第一个示例中,类
B
有两个名为
a
的成员,一个是从类
a
继承的,另一个是它自己定义的。因此,类B的对象最终会变大,并且您仍然可以显式访问类
a
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类{public:inta;};
B类:公共A{private:intA;};
int main()
{
A A;
B B;
printf(“sizeof(a)=%d,sizeof(b)=%d\n”,sizeof(a),sizeof(b));
b、 A::A=42;
printf(“%d\n”,b.A::A);
返回0;
}

在第二个示例中,由于私有继承,
a
将在那里,但不可访问。那么,有什么区别呢?@Poiuyt:有几个区别,其中一个显然是声明,马克指出了其中的一些区别。也许你需要澄清你所说的“区别是什么?”@pouyt:在第一个例子中,它与
a
不同。这是一个不同的
a
屏蔽
a::a
。哦。难道不应该有名字冲突吗@波依特:两个变量都被命名为
a
是合法的,因为它们的作用域不同。这类似于在函数中定义一个全局变量
a
,然后定义一个局部变量
a
。局部变量将隐藏全局变量,尽管您仍然可以使用
::a
访问全局变量。
error: 'int B::a' is private
error: 'int A::a' is inaccessible
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.
#include <stdio.h>

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

int main()
{
    A a;
    B b;
    printf("sizeof(a) == %d, sizeof(b) == %d\n", sizeof(a), sizeof(b));

    b.A::a = 42;
    printf("%d\n", b.A::a);

    return 0;
}