接下来,我们看一个练习,大家思考一下,会输出什么呢?#include <iostream> using std::cout; using std::endl; class A{ public: virtual void func(int val=1){ cout << "A->" << val << endl; } virtual void test(){ func(); } private: long _a; }; class B :public A{ public: virtual void func(int val = 10){ cout << "B->" << val << endl; } private: long _b; }; int main() { B b; A* p1 = (A*)&b; B* p2 = &b; p1->func(); p2->func(); return 0; } 为什么输出B->1,B->10
时间: 2024-04-11 16:29:52 浏览: 62
这段代码的输出结果是 "B->1" 和 "B->10"。
在这段代码中,存在一个虚函数 func(),它在类 A 和类 B 中被重写。类 A 中的 func() 函数有一个默认参数值为 1,而类 B 中的 func() 函数有一个默认参数值为 10。
在主函数中,先创建了一个对象 b,然后分别用指向 A 类型的指针 p1 和指向 B 类型的指针 p2 分别指向对象 b。
当调用 p1->func() 时,由于 p1 的类型是 A*,因此会调用类 A 中的虚函数 func()。由于虚函数的动态绑定特性,实际上会调用类 B 中的 func()。但是,由于虚函数不参与默认参数的动态绑定,所以调用时使用了类 A 中默认参数值 1,输出结果为 "B->1"。
当调用 p2->func() 时,由于 p2 的类型是 B*,因此直接调用类 B 中的 func() 函数。此时使用的默认参数值是类 B 中定义的值 10,输出结果为 "B->10"。
相关问题
#include <iostream> #include<algorithm> #include<cmath> #include <queue> using namespace std;
#include <iostream>:这是C++标准库中的头文件,用于输入输出流操作,包括cin、cout等。
#include<algorithm>:这是C++标准库中的头文件,用于提供各种算法操作,如排序、查找等。
#include<cmath>:这是C++标准库中的头文件,用于提供数学函数操作,如绝对值、平方根等。
#include <queue>:这是C++标准库中的头文件,用于提供队列操作,包括入队、出队等。
using namespace std;:这是C++的命名空间声明,表示使用std命名空间,可以直接使用std中的函数和对象。
#include <iostream> #include <fstream> #include <vector> #include <string> using namespace std; //
这是一段C++程序的头文件部分,包含了一些标准库的头文件,具体介绍如下:
1. iostream:提供了输入输出流的基本功能,如cin、cout等。
2. fstream:提供了文件操作相关的功能,如读写文件等。
3. vector:提供了可变大小数组的功能,可以方便地进行动态管理。
4. string:提供了字符串相关的功能,如字符串的拼接、截取等。
其中,using namespace std; 表示使用标准命名空间,可以简化程序中的代码。
阅读全文