刚刚学会了Java中类的继承的正确应用,并想到将它应用于我用C ++编写的一些代码。
以下是空Node.cpp的标头:
#ifndef Node_h
#define Node_h
#include <string>
using namespace std;
///////////////////////////////////////////////////////
//Class Declarations
class Array;
class Hash;
class Node;
class BodyNode;
class RealNode;
class CharNode;
class ComboNode;
class EndNode;
class HashNode;
class NodeFollower;
///////////////////////////////////////////////////////
//Class Definitions
class Node{
public:
virtual string toString(int info) = 0;
};
class BodyNode: public Node{
public:
};
class RealNode: public BodyNode{
protected:
Hash *wordHash, *addressHash;
Array *followers;
int count;
//Initialization
RealNode();
~RealNode();
//Hashes
BodyNode getNext(int address);
NodeFollower getWord(BodyNode *word);
NodeFollower getAddress(int address);
string toString(int info);
};
#endif
从此代码中,我收到以下错误:
Node.h:43:11: error: invalid abstract return type for member function ‘BodyNode RealNode::getNext(int)’
Node.h:28:7: note: because the following virtual functions are pure within ‘BodyNode’:
Node.h:25:17: note: virtual std::string Node::toString(int)
在google,stackoverflow和cplusplus上查看了这一点,虽然我找到了很多围绕这个问题的答案,但我找不到我需要解决的确切答案。我从中获取的cplusplus.com网站是:
http://www.cplusplus.com/doc/tutorial/polymorphism/
此外,我在stackoverflow上找到的一些答案表明
using namespace std;
是要避免的,听起来有充分的理由,但我无法弄清楚如何包含字符串。我试过了
string::string
每个声明,我试过
using namespace std::string;
但两者都无济于事。提前感谢您的帮助!
答案 0 :(得分:3)
你的第一个问题是BodyNode继承了具有toString()
纯虚函数的常规Node。如果它是纯虚拟的(= 0),那么你必须在所有派生类中为它提供一个定义,而你却没有。
因此,由于您未在BodyNode
中提供纯虚函数定义,因此它也是一个抽象类且不可实现(抽象类具有一个或多个纯虚方法,因此无法实例化)
您还遇到getNext()
返回BodyNode
类型的问题,并且由于BodyNode
是抽象的,这是不可能的 - 您可以返回指向它的指针而不是-copy-value,但我认为你真正的问题是它首先不应该是抽象的。
在BodyNode中提供默认的toString()
功能来解决您的问题。
答案 1 :(得分:2)
您不能将抽象类用作函数返回类型。但您可以返回指针或引用它,如下面的声明:
BodyNode* getNext(int address);
BodyNode& getNext(int address);
您可以将字符串声明为:
#include <string>
...
std::string myString;
答案 2 :(得分:0)
由于BodyNode
也是一个抽象类,因此无法从getNext
返回。您必须返回引用或指针。
答案 3 :(得分:0)
BodyNode
也是一个抽象类,因为 - 从抽象类派生的类必须实现纯虚函数,或者它们也是抽象类。
您无法返回BodyNode
类型的对象。您只能返回指针或引用。请参阅 -