对C ++继承感到困惑

时间:2015-05-19 12:56:49

标签: c++ inheritance

代码段:

class A
{
    protected:
    int b;
};

class B : public A
{

};

struct C : B
{
    int call (const C&);
};

class D : B
{
    int call (const C&);
};

int C::call (const C& c)
{
    return c.b;
}

int D::call (const C& c)
{
    return c.b;
}

int main (void)
{
    return 0;
}

为什么c.b可以访问C::call()而不是D::call()

不,他们一样吗?它们都是从外面引用的!

以下是GCC编译器给出的错误消息:

main.cpp: In member function 'int D::call(const C&)':
main.cpp:4:9: error: 'int A::b' is protected
     int b;
         ^
main.cpp:29:14: error: within this context
     return c.b;
              ^

1 个答案:

答案 0 :(得分:1)

您的继承树如下: enter image description here

所以C是一个B,它本身就是A.由于b受到保护,C和B可以访问它们从A继承的b。

同样,D是B,它本身就是A.所以D和B可以访问从A继承的b。

然而,C和D没有直接关系。他们就像另一个人的陌生人。所以C不能从D看到b,D也不能从C看到b。

查看您的代码:

首先,在以下代码中,您不会返回对象的b成员。您返回作为参数传递的另一个C对象的b:

int C::call (const C& c)
{
    return c.b;
}

详细说明,C的任何成员函数都可以访问任何C对象的所有成员。所以这个函数是有效的C ++代码。

下一个功能也不起作用:

int D::call (const C& c)
{
    return c.b;
}

传递给D的这个成员函数的参数是C类。如上所述,C和D没有直接关系。所以C对象就像是D的成员函数的黑盒子。因此该函数只能访问C的公共成员。

这就是您收到此错误消息的原因:D对象无法访问C对象的受保护或私有成员。