虚函数的默认参数的值是依赖对象静态类型决定的

虚函数的默认参数的值是依赖对象静态类型决定的

我们来先从一道题来引出这个问题:

在这里插入图片描述

这道题的要求是输出结果是什么?

如果你的选项不是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

叮~?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章