首页 > 解决方案 > 从基类方法或其他建议访问派生类方法

问题描述

考虑下面的代码(我知道你可能认为这是一个奇怪的设计。我愿意接受建设性的建议):

class Graphics
{
    // ...

public:
    template <typename Type, typename... Types>
    void draw(Type const& object, Types const&... objects)
    {
        // ...
        addToBatch(object, objects...);
        // ...
    }

protected:
    void addToBatch(Type const& object, Types const&... objects)
    {
        _addToBatch(object);
        if constexpr (sizeof...(objects) > 0)
            addToBatch(objects...);
    }

    void _addToBatch(Rect rc, Brush b);
    void _addToBatch(std::pair<Rect, Brush> rcAndBrush)
    {
        _addToBatch(rcAndBrush.first, rcAndBrush.second);
    }
    void _addToBatch(TextLayout const& tl, Brush b, Point origin);
    // ... etc
}


class SpecializedGraphics : public Graphics
{
    // ...

protected:
    // here I want to implement methods for specialized complex processing,
    // which will use _addToBatch methods from base class
    void _addToBatch(Entry const& e);
    void _addToBatch(Menu const& menu);
    // etc
}

int main()
{
    Rect rcClient;
    Brush brush;
    Entry e;
    Menu menu;
    // etc

    SpecializedGraphics gfx;
    gfx.draw(
        std::make_pair(rcClient, brush),
        e,
        menu,
        // etc
    )
    return 0;
}

这段代码给了我一个编译器错误。我想这是因为 Graphics::draw 是基类方法,无法访问派生类的方法。如何正确解决此问题?我想到的一种解决方案是将draw方法的定义从基类复制/粘贴到派生类(名称隐藏)。有更好的建议吗?因为为什么我需要定义已经定义的内容。

标签: c++inheritanceoverridingoverloadingvariadic-templates

解决方案


您可以使用纯虚函数,在您的基类中更改您想要将实现保留为派生类的方法声明,如下所示:

virtual void _addToBatch(Rect rc, Brush b) = 0;

通过这样做,该方法现在被声明为纯虚拟,

现在,在您的 Specialized 类中,您必须定义这些函数:

class SpecializedGraphics : public Graphics
{
 protected:
  void _addToBatch(Rect rc, Brush b);

推荐阅读