c++ - 对C++继承感到困惑

标签 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;
              ^

最佳答案

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

所以 C 是一个 B,它本身就是一个 A。因为 b 是 protected ,所以 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 的公共(public)成员。

这就是您收到此错误消息的原因:D 对象无权访问 C 对象的 protected 或私有(private)成员。

关于c++ - 对C++继承感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30326287/

相关文章:

javascript - 为什么 a.y 在这里未定义?

C++ - std::vector 安全多线程

c++ - 每次运行程序时都使用相同的随机数

ios - 无法访问我覆盖的单元格类

ios - Swift 中的通用类继承

c++ - 子类对象列表重新解释为基类对象列表? (C++11)

c++ - 写入类的最后一个字节

c++ - 类无法找到另一个类(单独的头文件): C++

C++ 删除不应该执行任何操作

c# - 在我自己的 "UITableViewController"中使用默认实现使方法可选