如何重载运算符,而不是同时使用“奇怪的重复模板模式”和“运行时多态”

时间:2016-03-28 01:38:49

标签: c++ templates polymorphism operator-overloading

  1. 我只想在“数字”类中overload + and = operators

  2. 我想要两个孩子班 A.整数B.分数,实现"Number" class。目前以下是我的代码的样子。但在这里我使用的是both Static and Run time polymorphism paradigm。如何避免呢?

  3. 代码段:

    数字等级:

    template<class T>
    
    class Number
    {
        virtual T& operator= (const T &) = 0;      
        virtual const T operator+ (const T &) = 0;
        virtual void display(std::ostream &) = 0;
    };
    

    整数类:

    // operator "=" overloading 
    Integer& Integer::operator=(const Integer &secondNumber)
    {
        intValue = secondNumber.intValue;
        return *this;
    }
    
    // operator "+" overloading
    const Integer Integer::operator+(const Integer &secondNumber) 
    {
         Integer temp;
         temp.intValue = this->intValue + secondNumber.intValue;
         return temp;
    }
    

    另外,如果我从“Number”类中删除“template”,我就不能重载+运算符,因为它返回类实例,而且我们不能有一个抽象类的实例,它是“Number class”

    另外,如果我不能删除虚拟关键字,因为我希望我的孩子实现“数字类”中的方法。

    请指点我这里有没有办法在代码中没有这两种类型的范例,即静态和动态。

1 个答案:

答案 0 :(得分:1)

你需要决定你更喜欢哪种方法,也许你也只想使用这种方法。但是我没有在代码中看到编译时多态性,只是创建了通用模板的多个实例。这两个实例没有任何共同点,除非它们也继承了一个公共接口。

关于决定使用哪种方法,而不是查看你想要从代码中获取的内容,我发现的是:你需要决定哪些功能你不需要,或者可能不想包含在你的设计。

这是一个非常有限的积分列表,根据您的具体情况可能有好有坏:

编译时间多态性。

  • 高效;无需虚拟调用,编译器可以很好地优化代码。
  • 非常严格(没有基本定义的虚函数):没有派生实现,繁荣,没有编译。
  • 基础对象(从动态角度来看)不常见,但对模板实例化是唯一的。
  • 混合大量实例化可能会产生很大的开销(您还可以进一步抽象设计以缓解这种情况)。

动态多态性。

  • 唯一(派生)类型包含一个通用接口。
  • 一旦使用基指针或引用,就可以放弃一些优化(编译时方法可以内联在当前源中定义良好且可用的所有内容,如果需要的话)。
  • 除非虚函数是纯粹的:没有实现,没有后顾之忧,没有错误(编译时,你必须发现运行时错误)。

我可以假设您的Number课程不需要混合类型数组(Number<int>&amp; Number<float>)。如果是这种情况,编译时解决方案可能是合适的。但是,如果您想要创建一个可以在任何形式的Number上运行的函数,那么您必须从Number中删除该模板或将该函数实现为模板(最终可能会使用代码每T个重复一次。

U 根据更具体的需求更新您的问题,正确的方法或组合将更加明显。我也会更新这个答案。

我的大部分观点来自于使用嵌入式系统。需要考虑系统功能才能做出明确的决策。如果您可以掠夺资源而对用户体验影响不大,那么使代码变得非常抽象并且肉眼难以理解可能是不值得的。