虚函数的默认参数的值是依赖对象静态类型决定的
我们来先从一道题来引出这个问题:
这道题的要求是输出结果是什么?
如果你的选项不是B,那么你需要跟着我一起来学习一下,虚函数的默认参数到底需要取哪个?
标准库规定
就是说,虚函数的默认参数取的是静态类型的。
那么什么是静态类型呢?举个栗子?
A *a = new A; // 这里静态类型就是A
B *b = new B; // 这里静态类型就是B
// 调用虚函数
void test(base& b)
{
b.fun(); // 这里不管传进来的是什么类型,静态类型都是 base
}
题目解释
现在大家应该大概明白了,我们再看看这道题。
首先创建一个 B 类对象,B *p = new B;
、然后用这个 B 类指针调用 test 函数。
关键来了:这里 test 在A类里面,所以 test 的调用栈是这样的:
void test()
{
A *this;
this.func(); // 这里静态类型是A。
}
所以最后虚函数的默认参数取的是 A 类虚函数默认参数,内容由于 B 类的虚函数对 A 类的虚函数进行了覆盖,所以用的是 B 类的内容。
所以结果是 B->1
。
叮~?