当前位置:  开发笔记 > 编程语言 > 正文

C++ protected:无法从派生类中访问base的受保护成员

如何解决《C++protected:无法从派生类中访问base的受保护成员》经验,为你挑选了0个好方法。

不可否认,这个问题标题听起来与迈克一再提出的邻居问题完全相同.我发现了很多相同问题的问题,但没有一个是我的问题.

首先,我想澄清一下这个问题的背景:

1,c ++访问控制基于类而不是基于实例.因此,以下代码完全有效.

class Base
{
protected:
    int b_;

public:
    bool IsEqual(const Base& another) const
    {
        return another.b_ == b_; // access another instance's protected member
    }
};

2,我完全理解为什么以下代码无效 - 另一个代码可能是兄弟实例.

class Derived : public Base
{
public:
    // to correct the problem, change the Base& to Derived&
    bool IsEqual_Another(const Base& another) const
    {
        return another.b_ == b_;
    }
};

现在是时候卸载我真正的问题了:

假设在Derived类中,我有一个Base实例数组.如此有效,Derived IS A Base(IS-A关系),Derived由Base(复合关系)组成.我从某个地方读到这个(指的是IS-A和Has-A的设计)是一种设计气味,我首先应该永远不会有这样的场景.嗯,例如,Fractals的数学概念可以通过IS-A和Has-A关系建模.但是,让我们暂时忽略对设计的看法,只关注技术问题.

class Derived : public Base
{
protected:
    Base base_;

public:
    bool IsEqual_Another(const Derived& another) const
    {
        return another.b_ == b_;
    }

    void TestFunc()
    {
        int b = base_.b_; // fail here
    }
};

错误消息已经非常清楚地说明了错误,所以在答案中无需重复:

Main.cpp:140:7:错误:'int Base :: b_'受保护int b_; ^ Main.cpp:162:22:错误:在此上下文中int b = base_.b_;

真的,根据以下2个事实,上面的代码应该有效:

1,C++访问控制基于类而不是基于实例(因此,请不要说我只能访问Derived的b_;我无法访问独立的Base实例的受保护成员 - 它是基于类的).

2,错误消息显示"在此上下文中" - 上下文是Derived(我试图从Derived中访问Base实例的受保护成员.这是受保护成员的特性 - 它应该能够从Base内部访问或者任何来自Base的东西.

那么为什么编译器会给我这个错误呢?

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有