c++ 虚函数动态多态性
来源:互联网 发布:java调用mondodb的sum 编辑:程序博客网 时间:2024/06/06 18:47
下面对比展示虚函数的多态性
以下定义了3个类,
男人------->继承------->人类
人类------->继承------->动物类
每个类中定义两个方法:
虚函数------->virtual void eat();
函数------->void run();
下面具体来看看它们在调用时有什么区别
动物类:
#pragma onceclass Animal{public:void run();virtual void eat();};
#ifndef ANIMAL_H_#define ANIMAL_H_#include "Animal.h"#include <iostream>using namespace std;void Animal::run(){cout << "Animal::run()" << endl;}void Animal::eat(){cout << "Animal::eat()" << endl;}#endif
人类:
#pragma once#include "Person.h"class Man: public Person{public:virtual void eat();void run();};
#ifndef PERSON_H_#define PERSON_H_#include "Animal.h"#include "Person.h"#include <iostream>using namespace std;void Person::go(){cout << "Person::run()" << endl;}void Person::eat(){cout << "Person::eat()" << endl;}#endif
男人类:
#pragma once#include "Person.h"class Man: public Person{public:virtual void eat();void run();};
#ifndef MAN_H_#define MAN_H_#include "Man.h"#include "Person.h"#include <iostream>using namespace std;void Man::run(){cout << "Man::run()" << endl;}void Man::eat(){cout << " Man::eat()" << endl;}#endif
main函数
#include <iostream>#include "Animal.h"#include "Person.h"#include "Man.h"using namespace std;void fun1(Animal *a){a->eat();}void fun2(Animal *a){a->run();}void main(){Animal a;fun1(&a);fun2(&a);Person p; fun1(&p);fun2(&p);Man m;fun1(&m);fun2(&m);system("pause");}
这有点像Java中父类引用指向子类实例
结果为什么不一样呢?
因为虚函数跟普通函数的区别就是当基类指针或引用指向派生类对象时,通过指针或引用调用成员函数,对于非虚函数,调用的是静态类型(指针/引用类型),对于虚函数,在运行时动态绑定,调用的是动态类型
简单来说,void run() 函数就是静态调用 所以是Animal的 run方法 , virtual void eat() 是动态调用,指向了实例化的eat方法。
0 0
- c++ 虚函数动态多态性
- c++--多态性与虚函数
- [C++] 多态性与虚函数
- C++:多态性(虚函数)
- c++--多态性和虚函数
- 多态性(二)——动态多态性之虚函数
- 【原创】多态性、动态多态性、静态多态性、虚函数、纯虚函数、抽象类总结
- 多态性之动态联编 虚函数
- C语言模拟C++虚函数多态性
- C/C++多态性(polymorphism)虚函数
- C/C++中多态性与虚函数
- C++__多态性与虚函数
- C++-虚函数,多态性,纯虚函数,抽象类
- 【C++】多态性(函数重载与虚函数)
- C/C++——多态性和虚函数
- C语言实现函数多态性
- 多态性与虚函数
- 多态性与虚函数
- leetcode Sort List
- 如何提问才能进阶成为前端大神?(转自张鑫旭的博客)
- 使用Bootstrap时遇到的问题
- zzuli OJ 1092: 素数表(函数专题)
- 数据结构 - 树
- c++ 虚函数动态多态性
- 黑马程序员_多线程(一)
- 常见排序算法小结
- windows系统更改账户信息
- JS修改CSS
- JavaScript 三个等号
- javaSE基础编程——GUI窗体
- 试试193
- 最能燃起你学习激情的一句话是什么