我想将重载的运算符添加到派生类

时间:2018-02-10 15:18:45

标签: c++ inheritance polymorphism derived-class base-class

C ++

我一直在努力学习InheritancePolymorphism几周。我可以和狗和猫一起玩哺乳动物,O可以从狗狗那里得到小狗,什么不可以。我有一个带有base class NaughtleNum a + operator而且derived class是Naughty1。 (对不起,但我讨厌Foo Bar)

以下是代码:

#include <iostream> 
#include <math.h>

using namespace std;

typedef unsigned char UCHAR;
typedef unsigned short int SHORT;

class NaughtleNum;
class Naughty1;

class NaughtleNum {
public:
    NaughtleNum() {
        cout << "Hello NaughtleNum 1\n";
    }; //constructors
    virtual~NaughtleNum() {
        cout << "Bye Bye NaughtleNum\n";
    }; //destructor
    virtual NaughtleNum * operator + (NaughtleNum * ) = 0;
};

class Naughty1: public NaughtleNum {
public: 
    Naughty1() {
        cout << "Hello Naughty1\n";
        value = 3;
    }; //constructors
    ~Naughty1() {
        cout << "Bye Bye Naughty1\n";
    }; //destructor
    Naughty1 * operator + (Naughty1 * ) {}
private: 
    UCHAR value;
};

int main() {

    cout << "I am Here\n";

    NaughtleNum * N1;
    N1 = new Naughty1;

    return 0;
}

我希望a + operator有两个淘气号码!

消息为:

daddio@LittleBeast:~/Programs/MyLib/Naughty> g++ -g -o NaughtleNum NaughtleNum.cpp
NaughtleNum.cpp: In function ‘int main()’:
NaughtleNum.cpp:35:12: error: cannot allocate an object of abstract type ‘Naughty1’
     N1=new Naughty1;
            ^
NaughtleNum.cpp:19:7: note:   because the following virtual functions are pure within ‘Naughty1’:
 class Naughty1: public NaughtleNum
       ^
NaughtleNum.cpp:16:30: note:    virtual NaughtleNum* NaughtleNum::operator+(NaughtleNum*)
         virtual NaughtleNum* operator + (NaughtleNum*) =0;
                              ^
daddio@LittleBeast:~/Programs/MyLib/Naughty> 

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

您获取抽象类错误的原因是因为您没有覆盖基类的二进制加法运算符!如果基类中有虚拟运算符,则派生类必须具有该运算符的相同签名。

Naughty1 * operator + (Naughty1 * ) {}

完全和100%不同:

virtual NaughtleNum * operator + (NaughtleNum * ) = 0;

但是,在您外出并更改签名以使其匹配之前,请考虑您确实是否需要运算符多态。每个类都有自己独特的二进制加法运算符,因此基类中不需要虚拟运算符。如果Naughty1有一个将返回并接受Naughtlenum的加法运算符,而是接受并返回Naughty1的运算符,则没有意义。

在旁注中,加法运算符应该只返回一个对象,而不是指向它的指针。