C++多态之虚函数
2019-04-11 19:24
106 查看
多态:不同对象收到相同消息时,产生不同的动作。(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作)。
在c++中实现多态,我需要利用基类指针可以在隐式转换下指向派生类这一特性。当我们传入不同的对象(基类或派生类)就可以发生多态
#include <iostream> using namespace std; class Parent{ public: void fun() { cout << "我是爸爸" << endl; } void test() { cout << "parent~~~~我是用来测试的" << endl; } }; class Son:public Parent { public: void fun() { cout << "我是儿子" << endl; } void measurement() { cout << "son~~~~我是用来测试的" << endl; } }; void Go(Parent *p) { p->fun(); } int main() { Parent p; Son S; Go(&p); Go(&S); system("pause"); return 0; }
上述代码中,void Go(Parent *p)函数就相当于领班发出的命令,Parent,Son就相当于不同的两个工人,而void fun()函数就相当于他们各自负责的工作。
运行结果:
而此时结果并不是我们所想的那样。让我们来分析一下:
p指针是指向基类的指针,所以他只能访问Parent::fun()和Parent::test()。并不能访问Son::fun()。为了解决这个问题我们必须要使用virtual关键字,在基类的将基类的void fun()函数写成虚函数,在派生类中在进行从写。这样我门就能很好的达到多态的目的。
运行结果:
在此我们已经成功的使用了多态,p指针是如何来选择到底是选择那个void fun()函数的呢?
其实在存在虚函数的类中都存在一个指向虚函数表的指针(VPTR)。在发生多态时都是根据VPTR指针的索引来调用不同的函数。
相关文章推荐
- C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数
- C++中虚函数和多态
- C++多态和虚函数学习笔记
- 多态与虚函数编程题 #3(C++程序设计第6周)
- [C++] 如何不用虚函数实现多态
- C++ 多态与虚函数
- 【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
- C++学习之多态篇(纯虚函数和虚函数的区别)
- [C++基础]重载、覆盖、多态与函数隐藏
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++多态与虚函数
- 一个C++的多态和虚函数实例
- c++ 35虚函数与多态(二)
- [C++基础]重载、覆盖、多态与函数隐藏(2)
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 【C++的探索路14】多态与虚函数之基础篇
- C++中的虚函数的作用主要是实现了多态的机制
- c++ 多态,虚函数、重载函数、模版函数
- C++里的继承和多态(中)――分析单继承、多继承、菱形继承(不含虚函数)
- C++多态、虚函数表、动态链接,虚函数指针,RTTI