抽象类,即至少有一个纯虚函数的类不允许对象实例化。但是,当从抽象类派生一个具体类并定义所有纯虚函数时,可以实例化该类的对象。
但是当创建派生对象时,首先必须创建一个未命名的基类对象。这是怎么发生的?我的意思是,如果不允许创建,如何创建这个未命名的抽象基类对象。
这就像说人类的心脏不能存在,因为它需要人类。但是当我们创造一个人的时候,我们必须首先创造心脏,但是当心脏离开人类就无法存在时,我们如何创造心脏呢?
答案是,因为我们将它们创建在一起,它们都是单个实体的一部分。
心与人是一起被创造的。
在构造函数完全完成之前,没有对象实际存在,此时心脏和人类作为单个对象存在。
你混淆了"不可能"one_answers"不允许"。当然,抽象类的实例化对于编译器来说是可能的;只是不允许编程
当创建派生对象时,首先创建一个未命名的基类对象待创建。这是怎么发生的?
IMO, 基类对象不是按照我们看到的方式创建的。是的,我们确实在基类中提供构造函数和方法等,但它们仅仅是初始化/赋值的工具。
实际上,派生类继承了它的基类部分,所以最终我们只是创建了派生类对象。类比的例子:
struct B {
int b;
virtual void foo() = 0;
};
struct D : B {
int d;
virtual void foo () {}
};
创建对象时,编译器将D
视为
struct D {
int b,d;
virtual void foo () {}
};
它看到D
满足了能够实例化对象的所有条件,并且它创建了对象