虚函数的作用和用法C++.doc
虚函数在C++中是实现多态性的重要机制,它允许通过基类的指针或引用调用派生类中的重写版本。多态性是面向对象编程的一个核心概念,它意味着不同对象对同一消息(函数调用)可以有不同的响应方式。在C++中,虚函数的作用就是确保在继承层次结构中,能够正确地调用到对象实际所属类的成员函数,而不是仅仅局限于基类的版本。 虚函数的声明使用`virtual`关键字。例如: ```cpp class A { public: virtual void print() { cout << "This is A" << endl; } }; ``` 在这个例子中,`print()`函数被声明为虚函数。当一个基类指针或引用指向派生类的对象时,调用`print()`会根据实际对象的类型调用相应的实现,而不是仅限于基类的`print()`。 如果我们有一个派生类`B`,它重写了`print()`函数: ```cpp class B : public A { public: void print() { cout << "This is B" << endl; } }; ``` 那么,即使我们用基类`A`的指针或引用操作`B`的对象,`B`的`print()`也会被调用,只要`print()`在基类中被声明为虚函数。 ```cpp int main() { A* p = new B(); p->print(); // 此时会调用 B::print() } ``` 虚函数的工作原理依赖于C++对象模型中的虚拟表(vtbl)和虚拟指针(vptr)。每个含有虚函数的类,编译器都会为其创建一个虚拟表,其中存储了类中虚函数的地址。每个对象实例在创建时,都会附加一个vptr,这个指针指向对应的vtbl。当通过指针调用虚函数时,实际上是通过vptr找到vtbl,然后根据vtbl中的索引调用相应的函数地址。 例如,如果我们有两个类`A`和`B`,它们都包含虚函数`fun()`和`fun2()`: ```cpp class A { public: virtual void fun() { cout << 1 << endl; } virtual void fun2() { cout << 2 << endl; } }; class B : public A { public: void fun() { cout << 3 << endl; } void fun2() { cout << 4 << endl; } }; ``` 编译器会为`A`和`B`创建各自的vtbl,每个vtbl对应一个函数地址列表。当我们通过`A`的指针调用`fun()`时,实际上是从对象的vptr获取到`A`的vtbl,然后找到`fun`函数的地址进行调用。如果该指针指向的是`B`的对象,那么调用的实际是`B`的`fun()`。 虚函数是C++中实现多态的关键,它通过虚拟表和虚拟指针机制确保了动态绑定的正确性,使得我们可以用统一的接口处理不同类型的对象,极大地增强了代码的灵活性和可扩展性。理解虚函数的工作原理有助于我们在设计和编写面向对象的程序时更好地利用多态特性。
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/release/download_crawler_static/3444224/bg1.jpg)
![](https://csdnimg.cn/release/download_crawler_static/3444224/bg2.jpg)
剩余6页未读,继续阅读
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/c9197959ba04470785998bddc0b15c5e_xgx198831.jpg!1)
- 粉丝: 262
- 资源: 34
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)