我有一个基类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();
};
有人有想法吗?
答案 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更新进行略微修改
A
和B
destructor
public
或{{1} protected
}。 A
constructor
protected
。virtual
和public
constructor
受保护的这些清楚地表明某人可以继承你的班级并且不会被构建。当他们看到它不能公开构建时,它将有助于提醒他们,无论是有工厂方法还是纯虚拟这样的抽象。
除此之外,Nemanja指出了使用不存在的构造函数的另一个问题。