Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使操作员超负荷工作,而不同时使用这两种方法”;奇怪的重复模板模式“;及;“运行时多态性”;_C++_Templates_Polymorphism_Operator Overloading - Fatal编程技术网

C++ 如何使操作员超负荷工作,而不同时使用这两种方法”;奇怪的重复模板模式“;及;“运行时多态性”;

C++ 如何使操作员超负荷工作,而不同时使用这两种方法”;奇怪的重复模板模式“;及;“运行时多态性”;,c++,templates,polymorphism,operator-overloading,C++,Templates,Polymorphism,Operator Overloading,我只想在的“Number”类中重载+和=运算符 我想要两个子类A.Integer B.Fraction,它实现了“Number”类。下面是我的代码的外观。但在这里,我同时使用了静态和运行时多态性范例。如何避免呢 代码段: 编号类别: template<class T> class Number { virtual T& operator= (const T &) = 0; virtual const T operator+ (const

我只想在的“Number”类中重载+和=运算符

  • 我想要两个子类A.Integer B.Fraction,它实现了
    “Number”类。下面是我的代码的外观。但在这里,我同时使用了静态和运行时多态性范例。如何避免呢

  • 代码段:

    编号类别:

    template<class T>
    
    class Number
    {
        virtual T& operator= (const T &) = 0;      
        virtual const T operator+ (const T &) = 0;
        virtual void display(std::ostream &) = 0;
    };
    
    另外,如果我从我的“数字”类中删除“模板”,我不能重载+运算符,因为它返回类实例,并且我们不能有一个抽象类的实例,即“数字类”

    另外,如果我不能取出virtual关键字,因为我希望我的孩子实现“Number class”中的方法


    请在这里给我一点指导,有没有办法在代码中不同时使用两种类型的范例,即静态和动态。

    您需要决定您喜欢哪种方法,以及为什么您只想使用其中一种。然而,我在代码中没有看到编译时多态性,您只是创建了一个通用模板的多个实例化。这两个实例化没有任何共同之处,除非它们也继承了一个公共接口

    关于决定使用哪种方法,而不是看你想从代码中得到什么,我发现的是:你需要决定你不需要什么功能,或者可能不想在你的设计中包含什么功能

    以下是一个非常有限的要点列表,根据您的情况,这些要点可能是好的,也可能是坏的:

    编译时多态性。
    • 高效;不需要虚拟调用,编译器可以很好地优化代码
    • 非常严格(没有基本定义的虚拟函数):没有派生实现、boom、编译
    • 基本对象(从动态角度来看)不是通用的,但对于模板实例化是唯一的
    • 混合大量的实例化可能会产生很大的开销(您还可以进一步抽象您的设计,以缓解这种情况)
    动态多态性。
    • 唯一(派生)类型包含公共接口
    • 一旦使用基指针或引用,就可能会失去一些优化(编译时方法可以内联当前源代码中定义良好且可用的所有内容,如果它愿意的话)
    • 除非虚拟函数是纯函数:没有实现,没有顾虑,没有错误(编译时,您必须发现运行时错误)
    我可以假设您的
    Number
    类不需要混合类型的数组(
    Number
    &
    Number
    )。如果是这种情况,编译时解决方案可能是合适的。但是,如果您想创建一个可以在任何形式的
    Number
    上运行的函数,那么您必须从
    Number
    中删除模板,或者将该函数作为模板来实现(可能最终导致每个
    T
    的代码重复)

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

    我的大部分观点来自于与嵌入式系统的合作。需要考虑系统能力,才能做出明确的决策。如果你能在对用户体验影响不大的情况下掠夺资源,那么让代码变得非常抽象和让人目不暇接可能是不值得的

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