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
原创粉丝点击