使用从模板化基类派生的类中的虚方法

时间:2014-05-29 18:14:52

标签: c++ templates

让我们考虑以下示例:

template<std::size_t F>;
class GenericColor
{
public:
    std::array<int, F> colorComponents;
    virtual void invertColor();
}

class RGBColor : public GenericColor<3>
{
    void invertColor();
}

class CMYKColor : public GenericColor<4>
{
    void invertColor();
}

当我的基类被模板化时,我将如何使用虚方法?它甚至可能吗?

GenericColor *color = new CMYKColor();

以下代码不起作用。我认为 RGBColor CMYKColor 有不同的基类,它会导致问题。有没有解决方法?

2 个答案:

答案 0 :(得分:4)

你是对的,两个派生类有不同的基类(GenericColor模板的不同特化)。两者都碰巧定义了一个名为invertColor的虚函数,但就编译器而言,这两者并不相关。

一种解决方案是将invertColor()移动到自己的类中,并从中派生GenericColor<>。这样,RGBColorCMYKColor在他们说invertColor时“意味着相同的事情”。

struct IGenericColor
{
   virtual ~IGenericColor() = 0 {}
   virtual void invertColor() = 0;
};

template<std::size_t F>
class GenericColor : public IGenericColor
{
public:
    std::array<int, F> colorComponents;
    virtual void invertColor(); // maybe you don't need an override here?
};

// rest as before

aschepler关于分离ColorComponents而不是使用多重继承/组合的评论似乎也是一个好主意;如果对你的情况有意义的话可能会更好。

答案 1 :(得分:2)

GenericColor不是一个类,不是您拥有上面定义的层次结构的方式。您可以基于类模板生成 GenericColor<>类,但每个类都是一个独特的类。

虚拟函数应该在继承&#34; silo&#34;中正常工作。由每个模板专业化定义;换句话说,CMYKColor::invertColor()应正确覆盖GenericColor<4>::invertColor()