c++ - 访问另一个子类中基类的 protected 成员

标签 c++ inheritance encapsulation protected

为什么会编译:

class FooBase
{
protected:
    void fooBase(void);
};

class Foo : public FooBase
{
public:
    void foo(Foo& fooBar)
    {
        fooBar.fooBase();
    }
};

但这没有?

class FooBase
{
protected:
    void fooBase(void);
};

class Foo : public FooBase
{
public:
    void foo(FooBase& fooBar)
    {
        fooBar.fooBase();
    }
};

一方面,C++ 为该类的所有实例授予对私有(private)/ protected 成员的访问权限,但另一方面,它不为子类的所有实例授予对基类 protected 成员的访问权限。 这在我看来相当不一致。

我已经测试过使用 VC++ 和 ideone.com 进行编译,并且都编译了第一个但不是第二个代码片段。

最佳答案

foo 接收到 FooBase 引用时,编译器不知道参数是否是 Foo 的后代,所以它必须假设不是。 Foo 可以访问其他 Foo 对象 的继承的 protected 成员,而不是所有其他同级类。

考虑这段代码:

class FooSibling: public FooBase { };

FooSibling sib;
Foo f;
f.foo(sib); // calls sib.fooBase()!?

如果Foo::foo可以调用任意FooBase后代的protected成员,那么它可以调用FooSibling的protected方法,它有与 Foo 没有直接关系。这不是 protected 访问应该如何工作的方式。

如果 Foo 需要访问所有 FooBase 对象的 protected 成员,而不仅仅是那些也被称为 Foo 后代的成员,那么 Foo 需要成为 FooBase 的好友:

class FooBase
{
protected:
  void fooBase(void);
  friend class Foo;
};

关于c++ - 访问另一个子类中基类的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11631777/

相关文章:

javascript - node.js 在 Web 开发环境中的位置在哪里?

c++ - 为什么 "std::string(blablabla());"编译没有错误?

c# - 面向对象的类型转换错误

c# - .NET 中的链接构造函数

java - 封装的指标是什么?

c++ - 作为一个没有CS学位的程序员,我是否必须广泛学习C++?

c++ - QT打开不存在的数据库

c++ - 防止继承类覆盖基类的虚函数

c# - 在覆盖期间将返回类型更改为派生类型

javascript - 封装在 Javascript 中