使用抽象基础来实现模板类的私有部分?

时间:2011-02-26 23:13:42

标签: c++

使用模板实现混合(作为多重继承的替代方法)时,存在所有代码必须位于头文件中的问题。我正在考虑使用抽象基类来解决这个问题。这是一个代码示例:

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;
}

以前有人走过那条路吗?我应该注意哪些陷阱?

1 个答案:

答案 0 :(得分:1)

似乎这不会按照你想要的方式工作,因为你失去了使mixin类的行为依赖于它的模板参数的能力。也就是说,如果要混合使用静态多态的功能或引用模板参数中的类,则不再可以这样做,因为无论模板参数如何,都将执行相同的代码。

但是,如果您的混合类型不依赖于模板参数,那么这似乎很好。但是,您可能希望创建在非虚拟中混合的函数,因为您可以静态地确定要调用的函数(即AbstractDrawable方法)。