【问题标题】:C++ error: cannot declare field to be of abstract typeC++ 错误:不能将字段声明为抽象类型
【发布时间】:2009-10-27 10:30:07
【问题描述】:

情况是这样的:

class Base {  
    virtual void methodA() = 0;  
    virtual void methodB() = 0;  
};

class Base_A : public Base {  
    void methodA(); 
    void methodB();  
};

class Base_B : public Base {  
    void methodA();  
    void methodB();  
};

class MyClass {
    private:  
        Base * b;   
};  

当我编译它给出错误信息:

error: cannot declare field MyClass::b to be of abstract type because the following virtual functions are pure within Base:
Base::methodA()
Base::methodB()

如何解决?

更新 它现在编译。我不知道我改变了什么

【问题讨论】:

  • 真的是Base * b; 而不是Base b; 吗?
  • 你的代码 sn-p 正确吗?它实际上编译正常并且是正确的。也许您的原始代码有“Base b”而不是“Base * b”。 'Base b' 会给出你得到的错误。
  • 另外..不要忘记将 Base 析构函数设为虚拟。
  • “现在可以编译了。我不知道我改变了什么”——魔术!

标签: c++


【解决方案1】:

您的代码看起来正确且完美。

你的基类是抽象的,所以你不能创建它的对象, 但是你可以明确地声明它的指针。

所以你可能写了 Base b 而不是 Base *b ,请检查一下。

【讨论】:

    【解决方案2】:

    您的代码 sn-ps 在我的计算机上编译得很好。你确定你使用的是Base* b,即。指针类型而不是Base b?

    【讨论】:

    • 我猜不是,因为编译器错误谈论的是抽象类型,而不是指针。
    • @Jurily:是的,Base 是抽象的。如果您尝试创建这种类型的字段 (Base b),编译器会抱怨 无法将字段 MyClass::b 声明为抽象类型。但是,指向抽象类型的指针不是抽象的,OP 的示例 (Base * p) 应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2015-09-11
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2021-12-07
    • 2021-06-10
    相关资源
    最近更新 更多