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

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

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

在这里插入图片描述

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

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

叮~?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值