【问题标题】:C++ pure virtual class questionC++纯虚类题
【发布时间】:2010-11-13 10:54:07
【问题描述】:

我正在尝试编写一个简单的 B+tree 实现(非常早期的阶段)。我有一个带有一些功能的虚拟类。不用说,我对这些策略非常陌生,并且遇到了各种各样的问题。

我正在尝试在 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;
}

感谢您提供的任何信息。

【问题讨论】:

  • 我要感谢大家的回复...我承认,我不是一个出色的 C++ 程序员,我正在尝试将其中一些新想法(虚拟类/函数)应用到这个项目中。我也很难确定错误代码的正面或反面,但你们都做得很好,帮助我看到了我的错误。谢谢!

标签: c++ inheritance polymorphism


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-17
            • 1970-01-01
            • 2011-09-08
            • 1970-01-01
            • 1970-01-01
            • 2012-10-11
            • 1970-01-01
            相关资源
            最近更新 更多