请考虑以下代码:
struct Foo
{
Foo operator+(const Foo &rhs) const;
// notice lack of: Foo operator*(const Foo &rhs) const;
};
template <class T>
struct Bar
{
T x, y;
T add() const { return x + y; }
T mul() const { return x * y; }
};
我有两个问题:
我可以继承Bar<Foo>
并将mul()
覆盖为有意义的内容吗?
如果我从未在任何地方使用Bar<Foo>
,我是否可以继承mul()
而不会覆盖mul()
?
答案 0 :(得分:3)
Bar<Foo>::mul()
不是虚函数,因此无法覆盖。
是的,如果您不使用模板成员函数,则它不会被实例化,并且您不会因实例化而导致任何错误。
您可以通过在子类中提供相同签名的函数来隐藏 Bar<Foo>::mul()
,并且由于 2 ,Bar<Foo>::mul()
将不会被实例化。然而,这可能不是一个好习惯。读者可能会对隐藏与覆盖相混淆,并且仅仅使用不同的函数名称并且从不使用mul()
或者为Foo提供Bar的显式特化,这样做没有多大好处。
答案 1 :(得分:3)
模板实际上是一种智能预处理器,它们不是编译的。如果你不使用某些东西,你可以编写完整的(语法上正确的)垃圾,即你可以继承
template <class T>
struct Bar
{
T x, y;
T add() const { return x + y; }
T mul() const { return x.who cares what-s in here; }
};
P.S。因为你的+运算符用在const函数中,所以它也应该声明为const。
编辑:好的,并非所有编译器都支持这个,这里是用gcc编译的:
template <class T>
struct Bar
{
T x, y;
T add() const { return x + y; }
T mul() const { T::was_brillig & T::he::slith(y.toves).WTF?!0:-0; }
};