### 虚函数的使用 在C++编程语言中,多态性是面向对象编程的一个核心特性,它允许我们使用父类的指针或者引用调用派生类的方法。实现多态的一种方式就是通过虚函数(virtual function)来完成。 #### 一、虚函数的概念 虚函数是一个成员函数,它在基类中被声明为`virtual`关键字。当一个类继承自包含虚函数的基类时,它可以重写这个虚函数,提供自己特定的实现细节。在运行时,可以通过基类类型的指针或引用调用派生类中的虚函数,这使得程序能够动态地选择正确的函数版本执行,从而实现了多态性。 #### 二、虚函数的语法与定义 虚函数的声明通常形式如下: ```cpp class Base { public: virtual void func() { /* 基类默认实现 */ } }; class Derived : public Base { public: void func() override { /* 派生类的新实现 */ } }; ``` 这里`Base`类中的`func`函数被声明为虚函数,而`Derived`类中覆盖了这个虚函数并提供了新的实现。 #### 三、示例代码分析 根据提供的代码片段,我们可以看到一个简单的虚函数使用示例。 1. **基类** `shape` 定义了一个虚函数 `area()`,该函数用于计算形状的面积。 2. **派生类** `tri` 和 `cir` 分别继承自 `shape` 类,并重写了虚函数 `area()`。`tri` 类用于计算三角形的面积,而 `cir` 类用于计算圆的面积。 3. **主函数** `main()` 创建了一个 `shape` 类型的数组 `s[2]`,并通过指向 `tri` 和 `cir` 类型对象的指针存储这些对象。然后,分别调用了这两个对象的 `area()` 函数来打印它们的面积。 ```cpp #include <iostream> using namespace std; class shape { public: virtual float area() { return 0.0; } // 面积函数 }; class tri : public shape { public: tri(float h, float w) { H = h; W = w; } float area() override { // 重写虚函数 return (H * W * 0.5); } private: float H, W; }; class cir : public shape { public: cir(float r) { R = r; } float area() override { // 重写虚函数 return (3.1415926 * R * R); } private: float R; }; int main() { shape* s[2]; // 创建一个shape类型的指针数组 s[0] = new tri(3, 4); // 创建tri对象 cout << s[0]->area() << endl; // 输出三角形面积 s[1] = new cir(5); // 创建cir对象 cout << s[1]->area() << endl; // 输出圆形面积 delete s[0]; // 释放tri对象内存 delete s[1]; // 释放cir对象内存 return 0; } ``` #### 四、注意事项 1. **虚函数表**:每个包含虚函数的类都会有一个虚函数表,用来存储指向虚函数的指针。 2. **虚函数调用机制**:通过基类指针调用虚函数时,实际上调用的是派生类的函数版本。 3. **性能考虑**:虚函数调用比非虚函数调用慢,因为需要通过虚函数表查找实际的函数地址。 4. **析构函数**:如果基类中有虚函数,那么最好将析构函数也声明为虚函数,以确保派生类对象可以正确释放。 虚函数是C++中实现多态性的关键工具之一,它使得代码更加灵活且易于扩展。理解虚函数的工作原理对于编写高效的面向对象程序至关重要。
class shape
{
public:
virtual float area() //将area定义为虚函数
{
return 0.0;
}
};
class tri:public shape
{
public:
tri(float h,float w)
{
H=h;
W=w;
}
float area()
{
return (float)(H*W*0.5);
}
private:
float H,W;
};
class cir:public shape
{
public:
cir(float r)
{
R=r;
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助