在C ++中使用带头文件的抽象类

时间:2012-02-20 12:25:03

标签: c++ polymorphism header-files

刚刚学会了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;

但两者都无济于事。提前感谢您的帮助!

4 个答案:

答案 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类型的对象。您只能返回指针或引用。请参阅 -

http://msdn.microsoft.com/en-us/library/c8whxhf1.aspx