带默认参数的虚函数,奇怪的输出
Virtual function with default argument, weird output
这段代码的输出是15
,我真的不知道为什么。我认为它在foo
函数中使用了x=5
,但我不知道为什么。有人能帮我吗?
#include <iostream>
#include <string>
using namespace std;
struct A
{
virtual int foo(int x = 5)
{
return x*2;
}
};
struct B : public A
{
int foo(int x = 10)
{
return x*3;
}
};
int main(int argc, char** argv)
{
A* a = new B;
cout << a->foo();
return 0;
}
我认为它在
foo
功能中使用x=5
,但我不知道为什么。
是的,这里使用了基类A
声明的默认参数(即5
),因为您在静态类型A*
的对象上调用foo()
。默认实参是基于静态类型而不是动态类型来决定的。
标准对此有明确的解释,$8.3.6/10默认参数[dcl.fct.default]:
(强调我的)
虚函数调用([class.virtual])使用默认实参在由静态确定的虚函数声明中表示对象的指针或引用的类型。一个覆盖派生类中的函数不会从中获取默认参数它覆盖的函数。(例子:struct A { virtual void f(int a = 7); }; struct B : public A { void f(int a); }; void m() { B* pb = new B; A* pa = pb; pa->f(); // OK, calls pa->B::f(7) pb->f(); // error: wrong number of arguments for B::f() }
- end示例]
这个调用有两个部分:
-
决定传递什么值给
x
-这是A::foo
的默认参数,即5,因为这是a
的静态类型,即编译时已知的类型。如果你仔细想想,这是编译器唯一的选择,因为它不能假设分配给a
的类型。 -
决定哪个类接收调用 -这是
B::foo
,因为a
所指向的对象的动态类型是struct B
。
因此你得到3*5作为你的输出
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用默认参数等选择模板专业化
- 具有默认模板参数的多态类的模板推导失败
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- CMake:默认情况下,如何使add_custom_command输出保持最新?
- 保证最大输出长度为双精度,并设置默认输出格式的精度
- 如何初始化可以设置为默认数组并将输入/输出作为数组的类函数?
- C 默认如何输出数组
- Switch语句不显示除默认语句之外的任何类型的输出
- 切换始终在猜测一个数字游戏上输出默认值
- 默认情况下构造函数插入数据后,我没有得到任何输出,但我不确定为什么不
- 如何使用 mac 的默认 midi 音序器作为 midi 输出?
- 访问Ximea相机并使用OpenCV设置预定义的分辨率时,由于相机默认分辨率的大小为Mat,因此显示混乱的输出
- 操作符重载等同于c++中的PHP, echo/print类变量作为默认输出
- c++中PRNG的默认随机引擎为每个适当种子的实例生成相同的输出
- 带默认参数的虚函数,奇怪的输出
- 为什么我得到这种输出,因为我知道数组中未初始化的整数元素的默认值是0
- C++ IO 二进制文件流:未指定输出时的默认值
- 使用核心音频从默认的线路输出声音设备中提取浮动