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 对象 的继承保护成员,而不是所有其他同级类。

考虑这段代码:

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/33850317/

相关文章:

c++ - 如何在 OPENCV 3.x C++ Visual Studio 2015 中声明 BruteForceMatcher

c# - 如何使用可以处理整数或字符串值的泛型创建抽象基类?

c++ - 将非虚拟接口(interface)和多级继承结合在一起

c++ - 如何仅使用函数访问私有(private)变量

c++ - VS2011代码分析

c# - 开发 Internet Explorer、浏览器帮助对象扩展?

c++ - 将转发引用作为 lambda 捕获传递

wpf - 通用类型 XAML 2009

javascript - functionName() 和 functionName.call(this) 之间的区别

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