我们无法创建抽象类的对象。构造函数创建任何被称为对象的类的新实例。
这就是我对构造函数,类和对象关系的了解。
如果我错了,请纠正我。
答案 0 :(得分:4)
它存在吗?
#include <iostream>
class A
{
public:
virtual void f() = 0;
A()
{
std::cout << "Yes it does!" << std::endl;
}
};
class B: public A
{
public:
void f() {}
};
int main()
{
B b;
return 0;
}
是的确如此!
技术原因是有人需要初始化A
的成员,这是构造函数的工作。但您可以轻松地将其推理如下:
继承关系通常称为“是”。例如,类型为B
的对象也属于A
类型。换句话说,B
是一种A
。 A
的构造函数构造了A
类型的对象。但上面的b
也是一种A
,因此A
必须有一个构造函数才能构造它。
答案 1 :(得分:2)
“抽象类的构造函数”是否存在?
假设可以有一个抽象类构造函数。就像任何其他类一样。默认情况下(如果您没有声明“自定义”构造函数或者您没有没有默认构造函数的成员对象),则会隐式定义两个:默认构造函数和副本构造
所以在这样的宣言中:
struct abstract_class {
virtual void func() = 0;
}
你还有建设者。
我们无法创建抽象类的对象。
是。对于抽象类的最常见定义,这是真的。如果某个类确实具有纯虚拟函数,则它被认为是抽象类,当然它无法实例化。
构造函数创建任何被称为对象的类的新实例。
我将其改为:您通过构造函数构造类类型的对象。是的,在C ++中,对象是(来自§1.8/ 1):
对象是存储区域。
就是这样。例如:
int x = 0;
也是一个对象。 对象并不一定意味着类类型。
答案 2 :(得分:2)
是的!它必须存在,因为任何子类的构造函数都会调用基础构造函数。 (这是解释它的最简单方法)
答案 3 :(得分:1)
抽象类可以包含成员变量并初始化这些成员变量抽象类需要构造函数。