使用模板实现混合(作为多重继承的替代方法)时,存在所有代码必须位于头文件中的问题。我正在考虑使用抽象基类来解决这个问题。这是一个代码示例:
class Widget
{
public:
virtual ~Widget() {}
};
// Abstract base class allows to put code in .cpp file.
class AbstractDrawable
{
public:
virtual ~AbstractDrawable() = 0;
virtual void draw();
virtual int getMinimumSize() const;
};
// Drawable mix-in
template<class T>
class Drawable : public T,
public AbstractDrawable
{
public:
virtual ~Drawable() {}
virtual void draw()
{ AbstractDrawable::draw(); }
virtual int getMinimumSize() const
{ return AbstractDrawable::getMinimumSize(); }
};
class Image : public Drawable< Widget >
{
};
int main()
{
Image i;
i.draw();
return 0;
}
以前有人走过那条路吗?我应该注意哪些陷阱?
答案 0 :(得分:1)
似乎这不会按照你想要的方式工作,因为你失去了使mixin类的行为依赖于它的模板参数的能力。也就是说,如果要混合使用静态多态的功能或引用模板参数中的类,则不再可以这样做,因为无论模板参数如何,都将执行相同的代码。
但是,如果您的混合类型不依赖于模板参数,那么这似乎很好。但是,您可能希望创建在非虚拟中混合的函数,因为您可以静态地确定要调用的函数(即AbstractDrawable方法)。