让我们考虑以下示例:
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 有不同的基类,它会导致问题。有没有解决方法?
答案 0 :(得分:4)
你是对的,两个派生类有不同的基类(GenericColor
模板的不同特化)。两者都碰巧定义了一个名为invertColor
的虚函数,但就编译器而言,这两者并不相关。
一种解决方案是将invertColor()
移动到自己的类中,并从中派生GenericColor<>
。这样,RGBColor
和CMYKColor
在他们说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()
。