欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

程序员文章站 2024-03-21 10:04:16
...

构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

一:构造函数不能声明为虚函数的原因

1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。
而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,
还是该类的一个派生类,或是更深层次的派生类。无法确定。

2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,
让他指向正确的虚函数表。
而在构造对象期间,虚函数表还没有被初 始化,将无法进行。

二:析构函数可以是虚函数,也可以是纯虚函数


 在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。

 class awov {

  public:

  virtual ~awov() = 0; // 声明一个纯虚析构函数

  };

    这个类有一个纯虚函数,所以它是抽象的,而且它有一个虚析构函数,所以不会产生析构函数问题。但这里还有一件事:必须提供纯虚析构函数的定义:

  awov::~awov() {} // 纯虚析构函数的定义

    这个定义是必需的,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~awov的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上。

    虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。抽象类的纯虚函数的实现可以由自身给出,也可以由派生类给出。错了,除了析构函数外,其他函数都不行,必须要在派生类中进行实现