继承和指向受保护成员的指针

时间:2015-11-26 17:11:25

标签: c++ pointers inheritance access-control protected

我正在为我正在编写的游戏创建一个基本的UI系统。它被组织成一个节点树。我正在尝试编写它,以便只有根节点可以在其他节点上调用update方法。我以为我理解了C ++的继承,但它又一次嘲笑我的无能。我试图在下面创建一个简单的例子:

error: 'virtual void Base::update_internal()' is protected

当我尝试编译时,这个GCC给了我错误:

{{1}}

包括root在内的所有节点都从Base继承了update_internal()方法,我不明白为什么它受到保护很重要。我认为只有派生类无法访问的私有成员和方法。

4 个答案:

答案 0 :(得分:4)

您只能从派生类的实例调用基类的受保护/私有函数(当然,除非您使用friend s)。因此派生类只能访问其基本部分的私有/受保护成员,而不能访问其他基础部分。在您的情况下,您可以通过引用

中的Base*来调用它
for(auto& node : m_nodes)
     node->update_internal();

所以编译器抱怨。

答案 1 :(得分:2)

与Base和Root成为朋友;

class Base
{
    friend class Root; // <- yes,this
    public:
        virtual ~Base() { }

    protected:
        virtual void update_internal() = 0;
};

答案 2 :(得分:1)

这是Template Method模式的股票示例 Root类的公共方法暴露了内部需要实现的内容。

答案 3 :(得分:1)

class Base
{
protected:
    virtual void update_internal() = 0;

    static void DoUpdate( Base *node )
    {
        node->update_internal();
    }
};

class Root : public Base
{
public: 
    void update()
    {
        for (auto node : m_nodes)
        {
            Base::DoUpdate( node );
        }
    }
protected:
    virtual void update_internal() override {}
    std::vector<Base*> m_nodes;
};