接下来,我们看一个练习,大家思考一下,会输出什么呢?#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 浏览: 19
这段代码的输出结果是 "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 <vector> #include <fstream> using namespace std; #include <boost/timer.hpp>
这段代码是一个C++程序的头文件部分,它包含了三个标准库的头文件和一个boost库的头文件。具体介绍如下:
1. `#include <iostream>`:这是C++标准库中的头文件,用于输入输出操作。它包含了一些常用的输入输出流对象,如`cin`和`cout`。
2. `#include <vector>`:这是C++标准库中的头文件,用于定义和操作动态数组(向量)。`vector`是一个模板类,可以存储任意类型的元素,并提供了方便的方法来访问和修改这些元素。
3. `#include <fstream>`:这是C++标准库中的头文件,用于文件输入输出操作。它提供了一些类和函数,可以方便地读写文件。
4. `#include <boost/timer.hpp>`:这是boost库中的头文件,用于计时器功能。boost是一个流行的C++扩展库,提供了许多高效且易于使用的功能和工具。