先说结论:C++中,构造函数不可以是虚函数,而析构函数可以且常常是虚函数。 虚函数的定义:类成员函数前面添加virtual关键字,则该函数被称为虚函数。 1、构造函数不可以是虚函数当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构。 虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中,当存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针)。在实现多态的过程中,父类和派生类都有vptr指针。 vptr的初始化:当对象在创建时,由编译器对vptr指针进行初始化。在定义子类对象时,vptr先指向父类的虚函数表,在父类构造完成之后,子类的vptr才指向自己的虚函数表。 如果构造函数时虚函数,那么调用构造函数就需要去找vptr,而此时vptr还没有初始化。 因此,构造函数不可以是虚函数。 2、析构函数常常是虚函数与构造函数不同,vptr已经完成初始化,析构函数可以声明为虚函数,且类有继承时,析构函数常常必须为虚函数。 比如下面的例子: 运行结果为: 若析构函数不是虚函数,则运行结果为: 可以看出:
|
/1
|手机版|免责声明|本站介绍|工控课堂
( 沪ICP备20008691号-1 )
GMT+8, 2025-12-23 12:11 , Processed in 0.062890 second(s), 23 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.