派生期间形成的未命名对象

时间:2011-08-17 03:11:55

标签: c++

抽象类即具有至少一个纯虚函数的类不允许对象实例化。但是当我们从这个抽象类派生一个具体类并定义所有纯虚函数时,我们可以实例化这个类的对象。

但是,在创建派生对象时,首先必须创建一个未命名的基类对象。这是怎么发生的?我的意思是如果不允许创建这个未命名的抽象基类对象,该如何创建它。

3 个答案:

答案 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正在满足能够实例化对象的所有条件,并且它会创建对象。