【问题标题】:How to inherit from Template class C++如何从模板类 C++ 继承
【发布时间】:2015-10-02 00:51:56
【问题描述】:

C++ 已经有一段时间了,我有一个类 Number 和几个子类,如 Integer、Decimal.. 我想重写 == 运算符来比较两个 num 在数字上相等时...我有类似以下的内容,但似乎无法弄清楚从模板类继承的子类的语法以及在子类中覆盖 == 运算符的语法...

template class <T>
class Number{
  T data;
   Number(T num) { data = num ;}
  boolean operator==(T &other){ return data == other; }
 }

class Integer : public Number{
 int iData;
 Integer(int i) { iData = i ; }
 boolean operator==(Integer &other){ return idata == other.iData; }

 }

【问题讨论】:

  • 这已经回答here.
  • class 应该在 &lt;&gt;Number 模板中
  • 你还需要以;结束你的类声明

标签: c++ inheritance operator-overloading


【解决方案1】:

您需要指定一个专业化,例如Number&lt;int&gt;。否则,您不能从模板继承,除非您的派生类本身就是模板。您的代码中还有一些其他错误,例如 cmets 中提到的错误,以及 operator== 运算符,它应该将 const Number&lt;T&gt;&amp; 作为参数。所以在你的情况下使用例如

class Integer : public Number<int>

一旦你这样做了,就不再需要在派生类中实现operator==,因为它将被继承。完整的工作代码如下:

#include <iostream>

template <class T>
class Number 
{
public:
    T data;
    Number(T num): data(num){}
    bool operator==(const Number<T> &other) { return data == other.data; }
};

class Integer : public Number<int> 
{
    using Number<int>::Number; // inherit the constructor
};

int main()
{
    Integer i1 = 10, i2 = 20;
    std::cout << std::boolalpha << (i1 == i2);
}

Live on Coliru

【讨论】:

  • 谢谢,但我想重写操作符在子类中做不同的事情。
  • @user1529412 如果你不想要基类中的行为,你仍然可以重载它,例如bool operator==(const Integer &amp;other) { return data == other.data; }
  • 很好,但让我感到困惑的部分(见下文),我如何子类化其他东西,如分数,我将如何为类分数做它:公众号 、fraction 可以有 int numer 和 int denom。
  • @user1529412 这告诉您Number 可能不是Fraction 的最佳基类。也许你不应该从Number 派生,而是使用Number 作为成员。
  • 问题清楚地表明整数和分数是数字......所以也许数字应该是一个接口。
【解决方案2】:

要么

template<class T>
class Integer : public Number<T> {

class Integer : public Number<int> {

取决于您是否希望 Integer 也成为模板

【讨论】:

  • 类 Fraction : public Number ,还有 operator == 怎么样?
  • 我认为FractionNumber 继承不是一个好主意。
  • 为什么分数不是数字。
  • 但是Number,在您的代码示例中,不是接口,而是实现,fraction 需要完全不同的实现。
  • 是的,我问的问题是分数和整数是数字,我需要使用根据数字类显示不同的显示方法,或者添加适用于所有类型的方法.. 这个意思是 Number 最好是接口?
【解决方案3】:

使用

template<class T>
class Number{
  T data;
   Number(T num) { data = num ;}
  boolean operator==(T &other){ return data == other; }
 };

template<typename T>
class Integer : public Number<T> {
 int iData;
 Integer(int i) { iData = i ; }
 boolean operator==(Integer &other){ return idata == other.iData; }

 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多