从派生类访问受保护的函数

时间:2015-05-30 21:17:29

标签: c++ crtp

我有以下典型场景,我希望在子类中隐藏实现细节,并通过接口公开它:

template <typename Derived>
class Interface
{
public:
    void a()
    {
        static_cast<Derived*>(this)->_a();
    }
};

class Implementation : public Interface<Implementation>
{
protected:
    void _a()
    {
        /*
        ...
        */
    }
};

我想我理解为什么这不起作用,我知道将Interface作为Implementation的朋友宣布解决它,但是当谈到更复杂的层次结构时,例如多个接口和各种级别的继承(就我的实际情况而言),事情变得非常混乱。

我希望避免在每个实现接口的类中声明friend class Interface<Implementation>

对于这个问题,是否有替代的漂亮和干净的解决方案?

谢谢!

2 个答案:

答案 0 :(得分:1)

如何使用虚函数和多态?

在子类中创建一个对象,并将其重新分配给接口类指针或引用。然后在接口类中创建一个纯虚函数,并在子类中定义它。

答案 1 :(得分:0)

您可以编写Interface的构造函数,以便必须为其调用_a。那就是:

template<class Derived>
class Interface
{
protected:
     explicit Interface(TypeForUnderscoreA fa);

};

然后使用它。

问题是TypeForUnderscoreA是什么?有几个选择。最简单的方法是将其设为std::function。这可行,但是,大概是你做了CRTP以避免虚函数。使用mem_fun和一些演员(丑陋但隐藏在Interface中)会让你付出简单间接的代价。