one_half 2014-10-26 06:07 采纳率: 0%
浏览 690

菜鸟 提问 C++ 多态问题 谁能解释一下结果1???

#include
class Base{
public : Base(){}
Base(bool arg){foo();}
virtual void foo(int i=42){cout<<"base "<<i<<endl;}

};
class Derived:public Base
{
public:Derived(){};
Derived(bool arg):Base(arg){foo();}
virtual void foo(int i=12){cout<<"Derived "<<i<<endl;}
};

//结果1:
//Derived 42
//Base 42 ????
int main(){
Derived d;
Base &b1=d;
//Base b2=d;
b1.foo();
//b2.foo();
return 0;
}

//结果2:
//Base 42
//Derived 12
int test(){

Base* b = new Derived(true);
delete b;
return 0;

}

  • 写回答

1条回答

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-05-27 00:13
    关注

    该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

    结果1的输出解释如下:

    1. 首先,创建一个Derived对象d。
    2. 将Derived对象d的引用赋值给一个Base引用b1。
    3. 调用b1.foo(),这是一个虚函数调用,根据多态性,它将调用Derived类中的foo()函数。
    4. Derived类中的foo()函数打印"Derived 42",这是因为在Derived类中定义的foo()函数有一个默认参数i=12,但在调用它时并没有传递参数,因此使用默认值12。
    5. 接下来,回到Base类的构造函数中,当创建Derived对象d时,会先调用Base的默认构造函数,然后调用Derived的构造函数。Derived构造函数中调用了Base构造函数,并传递了一个bool参数arg。在Base构造函数中,调用了foo()函数,但此时对象还没有完全初始化,因此会调用Base类中的foo()函数。
    6. Base类中的foo()函数打印"Base 42",这是因为在Base类中定义的foo()函数也有一个默认参数i=42,但在调用它时同样没有传递参数,因此使用默认值42。

    因此,结果1的输出为:
    Derived 42
    Base 42


    结果2的输出解释如下:

    1. 首先,使用new关键字创建一个Derived对象,并将其指针赋给Base指针b。
    2. 然后,调用delete b,释放内存并销毁对象。
    3. 在销毁对象时,会先调用Derived类的析构函数,然后调用Base类的析构函数。
    4. 由于Base类的析构函数是虚函数,因此会根据对象的实际类型调用Derived类的析构函数。
    5. Derived类的析构函数中没有任何输出语句,所以没有打印任何内容。

    因此,结果2的输出为:
    Base 42
    Derived 12

    评论

报告相同问题?

悬赏问题

  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题