C ++抽象类分配错误的类不是抽象的

时间:2014-04-01 14:49:33

标签: c++ abstract-class

我有一个基类A和派生类B.我想创建类B的对象,如

B *myB = new B();

但我在以下代码中遇到错误,例如“错误:无法分配抽象类型的对象”。但是,B类不是抽象类。

class A{
    public:
    A();
    virtual ~A();
    static void func1();
};

class B: public A{
    public:
    B(int myval);
    virtual ~B();
    void func2();
};

有人有想法吗?

3 个答案:

答案 0 :(得分:4)

除了示例中的语法错误之外,我认为这是您的问题:

class A{
 A();
 virtual ~A();
 static void func1();
 };

构造函数,析构函数和func1声明为private,因此您无法创建此类的实例。你应该让它们public:(至少是构造函数):

class A{
public:
 A();
 virtual ~A();
 static void func1();
 };

编辑正如您所说他们实际上是公开的,这是我能看到的第二个问题:

您正在使用B

的默认构造函数
B *myB = new B();

但您只有B(int)构造函数。

答案 1 :(得分:1)

如果你像在B类中那样提供了自己的构造函数,编译器将不会生成默认构造函数。您将需要显式提供默认构造函数B. 你可以添加

class B : public A
{
  public:
  B();
  B(int);
} 

答案 2 :(得分:0)

Nemanja有它的要点,但我会根据最新的OP更新进行略微修改

  1. 你还应该AB destructor public或{{1} protected }。
  2. 您可能也想A constructor protected
  3. 制作AbstractBaseClasses的关键点

    1. 您应该制作析构函数virtualpublic
    2. 您应该制作constructor受保护的
    3. 这些清楚地表明某人可以继承你的班级并且不会被构建。当他们看到它不能公开构建时,它将有助于提醒他们,无论是有工厂方法还是纯虚拟这样的抽象。

      除此之外,Nemanja指出了使用不存在的构造函数的另一个问题。