【问题标题】:Is there any difference these two pieces of code?这两段代码有什么区别吗?
【发布时间】:2010-06-13 18:31:16
【问题描述】:
#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

除了错误可能揭示的内容之外,这两段代码的行为有什么不同吗?

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    它们是不同的。在第一个实例中,您正在创建变量“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”变量的访问,我建议使用第二个示例,使用私有继承。请注意,私有继承也会使基类中定义的任何函数成为私有。

    【讨论】:

    • 在第二个例子中,由于私有继承,a 将在那里,但不可访问。那么,有什么区别呢?
    • @Poiuyt :有几个不同之处,其中一个显然是声明,其中一些是 Mark 指出的。也许您需要澄清“有什么区别?”的意思。
    • @Poiuyt:在第一个示例中,a 不一样。这是一个不同的a,它掩盖了A::a
    【解决方案2】:

    在您的第一个示例中,B 类有两个名为 a 的成员,一个是它从类 A 继承的,另一个是它自己定义的。 B 类的对象最终会变大,您仍然可以显式访问类 Aa 成员:

    #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;
    }
    

    【讨论】:

    • 哦。不应该有名称冲突吗? two variables with the same name?
    • @Poiuyt:将两个变量命名为a 是合法的,因为它们具有不同的作用域。这类似于拥有一个全局变量a,然后在函数中定义一个局部变量a。局部变量将隐藏全局变量,但您仍然可以使用 ::a 访问全局变量。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2021-06-28
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多