为什么派生类中的f()不覆盖基类中的f()?结果为什么是BBBfDD,而不是BBDfDD?

#include <iostream>

 

using namespace std;

 

class Base

 

{

 

public:

 

Base(){cout<<"BB";f();}

 

void f(){cout<<"Bf";}

 

};

 

class Derived:public Base

 

{

 

public:

 

Derived(){cout<<"DD";}

 

void f(){cout<<"Df";}

 

};

 

int main(){Derived d;return 0;}

参考GPT和自己的思路:

这是因为派生类中的f()函数并没有完全覆盖基类中的f()函数,而是建立了一个相同的函数名,因此在构造Derived类对象时,先调用基类构造函数,输出 "BB",并调用基类的f()函数输出 "Bf",接着再调用Derived类构造函数,输出 "DD",而在这个过程中,并没有调用Derived类中的f()函数。因此,最终输出的结果为 "BBBfDD",而不是 "BBDfDD"。如果要覆盖基类中的f()函数,可以在Derived类中加上virtual关键字,表示对基类中的f()函数进行了覆盖。

参考GPT和自己的思路:

在这个代码中,派生类Derived中的f()并没有完全覆盖基类Base中的f(),因为这里的f()没有使用virtual关键字。因此,当在类的构造函数中调用f()时,会根据对象的类型来选择要调用的函数。

在这个程序中,先创建Derived对象,然后构造函数会依次调用Base的构造函数和Derived的构造函数。当调用Base构造函数中的f()时,由于对象类型是Derived,因此应该调用Derived类中的f(),但由于没有使用virtual关键字,所以选择了Base类中的f()。

因此,输出结果为"BBBfDD",而不是"BBDfDD"。如果想要Derived类中的f()覆盖Base类中的f(),需要将Base类中的f()声明为virtual函数。