我一直在努力学习Inheritance
和Polymorphism
几周。我可以和狗和猫一起玩哺乳动物,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>
我在这里缺少什么?
答案 0 :(得分:0)
您获取抽象类错误的原因是因为您没有覆盖基类的二进制加法运算符!如果基类中有虚拟运算符,则派生类必须具有该运算符的相同签名。
Naughty1 * operator + (Naughty1 * ) {}
完全和100%不同:
virtual NaughtleNum * operator + (NaughtleNum * ) = 0;
但是,在您外出并更改签名以使其匹配之前,请考虑您确实是否需要运算符多态。每个类都有自己独特的二进制加法运算符,因此基类中不需要虚拟运算符。如果Naughty1
有一个将返回并接受Naughtlenum
的加法运算符,而是接受并返回Naughty1
的运算符,则没有意义。
在旁注中,加法运算符应该只返回一个对象,而不是指向它的指针。