继承C ++中的错误模板实例化

时间:2012-06-29 14:27:43

标签: c++ templates inheritance override instantiation

请考虑以下代码:

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()

2 个答案:

答案 0 :(得分:3)

  1. Bar<Foo>::mul()不是虚函数,因此无法覆盖。

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

  3. 您可以通过在子类中提供相同签名的函数来隐藏 Bar<Foo>::mul(),并且由于 2 Bar<Foo>::mul()将不会被实例化。然而,这可能不是一个好习惯。读者可能会对隐藏与覆盖相混淆,并且仅仅使用不同的函数名称并且从不使用mul()或者为Foo提供Bar的显式特化,这样做没有多大好处。

答案 1 :(得分:3)

  1. 确定
  2. 确定
  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; }
    };