我有以下典型场景,我希望在子类中隐藏实现细节,并通过接口公开它:
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>
。
对于这个问题,是否有替代的漂亮和干净的解决方案?
谢谢!
答案 0 :(得分:1)
如何使用虚函数和多态?
在子类中创建一个对象,并将其重新分配给接口类指针或引用。然后在接口类中创建一个纯虚函数,并在子类中定义它。
答案 1 :(得分:0)
您可以编写Interface
的构造函数,以便必须为其调用_a
。那就是:
template<class Derived>
class Interface
{
protected:
explicit Interface(TypeForUnderscoreA fa);
};
然后使用它。
问题是TypeForUnderscoreA
是什么?有几个选择。最简单的方法是将其设为std::function
。这可行,但是,大概是你做了CRTP以避免虚函数。使用mem_fun
和一些演员(丑陋但隐藏在Interface
中)会让你付出简单间接的代价。