3 回答
TA贡献1786条经验 获得超11个赞
默认参数完全是编译时功能。即在编译时执行默认参数的替换,以代替缺少的参数。因此,显然,成员函数的默认参数选择不可能取决于对象的动态(即运行时)类型。它始终取决于对象的静态(即编译时)类型。
您在代码示例中编写的调用将立即被编译器解释为bp->print(10)与其他无关。
TA贡献1878条经验 获得超4个赞
标准说(8.3.6.10):
虚函数调用(10.3)在虚函数的声明中使用默认参数,该声明由表示对象的指针或引用的静态类型确定。派生类中的重写函数不会从其重写的函数中获取默认参数。
这意味着,由于您要print通过类型的指针进行调用B,因此它将使用默认参数B::print。
TA贡献1813条经验 获得超2个赞
通常,使用在特定范围内可见的那些默认参数。您可以(但不应该)做一些时髦的事情:
#include <iostream>
void frob (int x) {
std::cout << "frob(" << x << ")\n";
}
void frob (int = 0);
int main () {
frob(); // using 0
{
void frob (int x=5) ;
frob(); // using 5
}
{
void frob (int x=-5) ;
frob(); // using -5
}
}
在您的情况下,基类签名是可见的。为了使用派生的默认参数,您必须通过指向派生类的指针显式调用该函数,方法是这样声明或正确地对其进行强制转换。
- 3 回答
- 0 关注
- 435 浏览
添加回答
举报