我想将超载运算符添加到派生类中

I want to add overloaded operators to a derived class

本文关键字:派生 添加 运算符 超载      更新时间:2023-10-16

c

我一直在努力学习InheritancePolymorphism数周。我可以和狗和猫一起哺乳动物,o可以从狗那里衍生出幼犬,什么不是。我有 a + operator naughtlenum base classderived 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 1n";
    }; //constructors
    virtual~NaughtleNum() {
        cout << "Bye Bye NaughtleNumn";
    }; //destructor
    virtual NaughtleNum * operator + (NaughtleNum * ) = 0;
};
class Naughty1: public NaughtleNum {
public: 
    Naughty1() {
        cout << "Hello Naughty1n";
        value = 3;
    }; //constructors
    ~Naughty1() {
        cout << "Bye Bye Naughty1n";
    }; //destructor
    Naughty1 * operator + (Naughty1 * ) {}
private: 
    UCHAR value;
};
int main() {
    cout << "I am Heren";
    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> 

我在这里缺少什么?

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

Naughty1 * operator + (Naughty1 * ) {}

是完全不同的,与:

100%不同
virtual NaughtleNum * operator + (NaughtleNum * ) = 0;

但是,在您外出并更改签名之前,请考虑您是否真的需要操作员多态性。每个类都将拥有自己的独特二进制添加操作员,因此基类中的虚拟操作员无需。Naughty1拥有一个会返回并接受Naughtlenum的添加操作员没有意义,而是会接受并返回Naughty1

在旁注上,加法运算符应仅返回对象,而不是指向其指针。