C ++纯虚拟类问题

时间:2009-07-23 16:01:04

标签: c++ inheritance polymorphism

我正在尝试编写一个简单的B +树实现(非常早期阶段)。我有一个带有一些功能的虚拟课程。毋庸置疑,我对这些策略很陌生,遇到各种各样的问题。

我正在尝试在BTree类中创建根节点。根节点将是BBranch,它应该继承自BNode?我收到错误

btree.cpp: In constructor âBTree::BTree()â:
btree.cpp:25: error: cannot declare variable ârootâ to be of abstract type âBBranchâ
btree.cpp:12: note:   because the following virtual functions are pure within âBBranchâ:
btree.cpp:9: note:      virtual void BNode::del(int)
btree.cpp: In member function âvoid BTree::ins(int)â:
btree.cpp:44: error: ârootâ was not declared in this scope

代码是这个

using namespace std;

class BNode {
  public:
    int key [10];
    int pointer [11];
    virtual void ins( int num ) =0;
    virtual void del( int num ) =0;
};

class BBranch: public BNode {
  public:
    void ins( int num );
};

class BLeaf: public BNode {
  public:
    void ins( int num );
};

class BTree {
  public:
    BTree() {
      BBranch root;
    };
    void ins( int num );
};

// Insert into branch node
void BBranch::ins( int num ){
    // stuff for inserting specifically into branches

};

// Insert for node
void BTree::ins( int num ){
  root.ins( num );
};

int main(void){
  return 0;
}

感谢您提供给我的任何信息。

5 个答案:

答案 0 :(得分:10)

编译器似乎很清楚什么是错的。您不能声明BBranch,因为该类中仍然存在纯虚函数。您定义了ins,但del仍未定义。在BBranch(和BLeaf)中定义,你应该没问题。

您不能声明抽象类的实例,它们是具有纯虚函数的类。

此外,您已在构造函数中声明root 。你的意思是它是一个成员变量,这意味着它需要在构造函数旁边声明,而不是在里面

class BTree {
  public:
    BTree() {
    };
    BBranch root;
    void ins( int num );
};

答案 1 :(得分:2)

如果像创建BNode一样创建抽象基类,并且想要创建具体的派生类,则必须实现所有纯虚函数。 BBranch和BLeaf都错过了'del'的实现,所以它们仍然是抽象的。

答案 2 :(得分:1)

在BTree构造函数中,您正在尝试创建BBranch的实例。但是BBranch没有del()的实现,因此它是一个抽象类,无法实例化。对于要实例化的类,它必须是具体的(即其所有成员函数必须具有实现)。

答案 3 :(得分:1)

第一个错误与BBranch没有为BNode :: del提供覆盖这一事实有关。由于del是一个纯虚函数(它没有默认实现),任何继承BNode的类都必须提供del的实现,或者该类是抽象的,即它不能被实例化。

第二个错误是因为你没有BTree :: root成员变量。你在BTree的构造函数中声明了root,然后在构造函数完成时将其销毁,所以当你尝试访问BTree :: ins中的root时,root就超出了范围(并且对象本身很可能被破坏)。

答案 4 :(得分:1)

错误消息为您提供所需的所有信息。阅读它。

您正在尝试创建BBranch类型的变量,但您的类BBranch是一个抽象类,就像BNode一样,从中继承。

我觉得这是一个家庭作业问题,所以我鼓励你回到你的教科书上阅读抽象类,它们是如何使用的,更重要的是,结束“抽象性”需要什么? / em>的