0

考虑以下代码:

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

我有两个问题:

  1. 我可以继承Bar<Foo>并覆盖mul()有意义的东西吗?

  2. 如果我从不在任何地方使用,我可以继承Bar<Foo>而不覆盖吗?mul()mul()

4

2 回答 2

3
  1. 当然
  2. 当然

模板实际上是一种智能预处理器,它们没有被编译。如果您不使用某些东西,则可以编写完整(语法正确)的垃圾,即您可以继承自

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

PS由于您的 + 运算符用于 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; }
};
于 2012-06-29T14:50:51.087 回答
3
  1. Bar<Foo>::mul()不是虚函数,所以不能被覆盖。

  2. 是的,如果您不使用模板成员函数,那么它不会被实例化,并且不会因实例化它而导致任何错误。

您可以通过在子类中提供相同签名的函数来隐藏 Bar<Foo>::mul(),并且由于2Bar<Foo>::mul()不会被实例化。但是,这可能不是一个好习惯。mul()读者可能会对隐藏与覆盖感到困惑,与简单地使用不同的函数名而不使用,或为 Foo 提供 Bar 的显式特化相比,这样做并没有太大的好处。

于 2012-06-29T14:31:07.560 回答