#include<iostream> using namespace std; class B{ public: virtual void f1(double x) {cout<<"B::f2(double)"<<2*x<<endl;} void f2(double x) {cout<<"B::f2(double)"<<2*x<<endl;} void f3(double x) {cout<<"B::f3(double)"<<3*x<<endl;} }; class D:public B{ public: int x; virtual void f1(double) {cout<<"D::f1(double)"<<x<<endl;} void f2(double) {cout<<"D::f1(double)"<<2*x<<endl;} void f3(double) {cout<<"D::f1(double)"<<3*x<<endl;} }; int main() { D d; B *pb=&d; D *pd=&d; pb->f1(1.23); pd->f1(1.23); pb->f2(1.23); pb->f3(1.23); pd->f3(3.14); return 0; }
时间: 2023-10-30 16:00:59 浏览: 85
这段代码是一个简单的 C++ 多态示例,包含一个基类 B 和一个派生类 D。B 中有三个函数 f1、f2、f3,其中 f1 是虚函数。D 继承自 B 并添加了一个成员变量 x,同时重写了 f1 和 f2 函数。
在 main 函数中,创建了一个 D 对象 d,以 B 指针指向该对象,以及以 D 指针指向该对象。然后分别调用了 pb->f1(1.23)、pd->f1(1.23)、pb->f2(1.23)、pb->f3(1.23)、pd->f3(3.14) 函数。
由于 f1 是虚函数,所以在调用 pb->f1(1.23) 和 pd->f1(1.23) 时,会调用 D 中重写的 f1 函数;而在调用 pb->f2(1.23) 和 pd->f2(1.23) 时,由于 f2 不是虚函数,所以会根据指针类型来决定调用哪个函数,即 pb->f2(1.23) 会调用 B 中的 f2 函数,pd->f2(1.23) 会调用 D 中的 f2 函数;最后调用 pd->f3(3.14) 时,由于 D 中没有重写 f3 函数,所以会调用 B 中的 f3 函数。输出结果如下:
D::f1(double)0
D::f1(double)0
B::f2(double)2.46
B::f3(double)3.69
B::f3(double)9.42
相关问题
#include <string>-#include <iostream>using namespace std:class shapel public: double getArea()(retur
`#include <string>` 和 `#include <iostream>` 是 C++ 中常用的头文件,分别用于字符串处理和输入输出操作。在这个头文件组合中,通常会出现在需要进行文本交互或字符串计算的程序中。
`class Shape` 似乎是一个自定义的 C++ 类,表示形状基础类。`getArea()` 函数是一个虚函数,返回一个 double 类型的值,代表该形状的面积。在这里,`Shape` 类可能用于定义一个形状家族,如 Circle、Rectangle 等,它们都有面积属性,但是计算方法各异。
`virtual double getArea() const;` 的意思是这个函数声明为虚拟的,并且有 const 关键字,意味着它可以在常量对象上调用。这样可以确保派生类能覆盖并提供自己的 `getArea` 计算实现。
例如,一个具体的圆形类 `Circle` 可能这样实现:
```cpp
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
virtual double getArea() const override { return M_PI * radius * radius; } // 返回圆的面积
};
```
#include <iostream> using namespace std;
#include <iostream> 是C++编程语言中的预处理指令,用于包含标准输入输出流库(Input/Output Stream Library),也就是常说的iostream。iostream库包含了基本的输入输出操作函数,如cin(用于从标准输入读取数据)、cout(用于向标准输出(通常是屏幕)输出数据)等。
`using namespace std;` 是C++中的命名空间声明,std是标准命名空间,用来避免在程序中频繁写出std::这样的前缀。当你使用`using namespace std;`后,就可以直接使用iostream库中的成员函数,例如cout、cin、endl等,而无需每次都加上std::前缀。
以下是这两句代码的作用示例:
```cpp
// 包含iostream库
#include <iostream>
// 使用std命名空间中的函数
using namespace std;
int main() {
cout << "Hello, World!" << endl; // 直接使用cout输出,无需std::
cin.get(); // 直接使用cin获取用户输入
return 0;
}
```
在实际编写C++代码时,这两个头文件通常会放在程序开始的位置,以便后续的代码可以方便地使用输入输出功能。
阅读全文