gpt4 book ai didi

c++ - 我可以调用一个方法,而无需在 c++ 中传递所需的参数。怎么来的?

转载 作者:IT老高 更新时间:2023-10-28 21:43:15 25 4
gpt4 key购买 nike

这里是代码...

#include "stdafx.h"
#include<iostream>
using namespace std;

class Base
{
public:
virtual void Display(bool b = false)
{
cout<<"Base"<<"\t"<<b<<endl;
}
};

class Derived : public Base
{
public:
virtual void Display(bool b) override
{
cout<<"Derived"<<"\t"<<b<<endl;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
Base* bp = new Base();
Derived* dp = new Derived();
bp->Display();
dp->Display(true);
bp = new Derived();
bp->Display();
cout<<"Done"<<endl;
return 0;
}

Display() 方法第二次使用 bp 调用时,令人惊讶的是它命中了 Derived 类中的方法。在 Derived 类中我没有指定默认参数。但它采用了默认的基类参数。怎么样?

最佳答案

这让很多人感到惊讶,但是默认参数是(或者参数是,如果你指定了多个)基于静态类型(指针被声明指向的类型)而不是动态类型(它当前恰好指向的对象的类型)。

因此,由于您使用的是 Base *bp,因此无论 bp 是否发生,都会使用 Base 中声明的默认参数指向 BaseDerived

如果您关心这是为什么:至少在典型的实现中,默认参数实际上完全在编译时处理。编译器看到您调用了 Display 却没有提供参数,并且 Display 有一个带有默认值的参数。因此,当它为该调用生成代码时,会生成代码以传递指定的默认值。那时,它甚至无法猜测调用发生时指针是否会指向某个派生类型,所以它只能根据静态类型生成代码。虽然这里不是这种情况,但当它生成代码来执行调用时,它甚至可能在尚未设计或编写的派生类上运行,因此使用该派生类中指定的值不可能的。

关于c++ - 我可以调用一个方法,而无需在 c++ 中传递所需的参数。怎么来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19043058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com