抽象类即具有至少一个纯虚函数的类不允许对象实例化。但是当我们从这个抽象类派生一个具体类并定义所有纯虚函数时,我们可以实例化这个类的对象。
但是,在创建派生对象时,首先必须创建一个未命名的基类对象。这是怎么发生的?我的意思是如果不允许创建这个未命名的抽象基类对象,该如何创建它。
答案 0 :(得分:3)
这就像说人类的心脏不能存在,因为它需要人类。但是,当我们创造一个人类时,我们必须首先创造心脏,但是如果没有人类,它们如何创造心脏。
答案是因为我们一起创造它们,它们都是单一实体的一部分 心与人是一起创造的 在构造函数完全完成之前,实际上不存在任何对象,此时心和人作为单个对象存在。
答案 1 :(得分:3)
你把“不可能”与“不允许”混为一谈。当然,编译器可以实例化抽象类;它只是不允许程序员。
答案 2 :(得分:0)
创建派生对象时,首先是一个未命名的基类对象 要被创造。这是怎么发生的?
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
正在满足能够实例化对象的所有条件,并且它会创建对象。