博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态重载与静态重载
阅读量:7080 次
发布时间:2019-06-28

本文共 2618 字,大约阅读时间需要 8 分钟。

hot3.png

了解一个概念:动态绑定和静态绑定:

下面看一段代码:

#include 
using namespace std;class Parent{public: void virtual foo() { cout << "foo from parent!\n"; } void foo1() { cout << "foo1 from parent!\n"; }};class Son : public Parent{public: void foo() { cout << "foo from son!\n"; } void foo1() { cout << "foo1 from son!\n"; }};int main(){ Parent *p = new Son; p->foo(); p->foo1(); return 0;}

 

运行之后,结果是:

foo from son!
foo1 from parent!

这是因为,编译器在遇到irtual函数时,采用动态绑定,这么讲吧,

对于重载的virtual函数,调用哪个函数是根据对象来决定的,这是在函数运行的动态过程中完成的。

对于非virtual函数,调用哪个函数是根据指针类型来决定的:编译器根据指针的类型静态的决定出来,这是静态绑定。

在C++中,函数默认的是静态绑定。

 

下面看一个经典用法:

// dscombine_poly.h#include 
#include
// 公共抽象基类Vehicleclass Vehicle{ public: virtual void run() const = 0;};// 派生于Vehicle的具体类Carclass Car: public Vehicle{public: virtual void run() const { std::cout << "run a car/n"; }};// 派生于Vehicle的具体类Airplaneclass Airplane: public Vehicle{public: virtual void run() const { std::cout << "run a airplane/n"; } void add_oil() const { std::cout << "add oil to airplane/n"; }};// 派生于Vehicle的具体类Airshipclass Airship: public Vehicle{public: virtual void run() const { std::cout << "run a airship/n"; } void add_oil() const { std::cout << "add oil to airship/n"; }}; // dscombine_poly.cpp#include
#include
//#include "dscombine_poly.h"// run异质vehicles集合void run_vehicles(const std::vector
& vehicles)//指针类型是vehicle,如果非virtual函数,则根据//指针类型来决定调用哪个函数,但此时是virtual的,所以动态绑定,根据调用对象来抉择{ for (unsigned int i = 0; i < vehicles.size(); ++i) { vehicles[i]->run(); // 根据具体的vehicle类型调用对应的run() }}// 为某种特定的aircrafts同质对象集合进行“空中加油”template
//模板,定义一个Aircraft类型,做为函数参数类型的集合,那么函数参数中,具体的就可以是任何类型void add_oil_to_aircrafts_in_the_sky(const std::vector
& aircrafts){//这个不管是irtual还是非irtual,都是使用对象类型(指针类型)来选择 for (unsigned int i = 0; i < aircrafts.size(); ++i) { aircrafts[i].add_oil(); }}int main(){ Car car1, car2; Airplane airplane1, airplane2; Airship airship1, airship2; std::vector
v; // 异质vehicles集合 v.push_back(&car1); v.push_back(&airplane1); v.push_back(&airship1); run_vehicles(v); // run不同种类的vehicles std::vector
vp; // 同质airplanes集合 vp.push_back(airplane1); vp.push_back(airplane2); add_oil_to_aircrafts_in_the_sky(vp); // 为airplanes进行“空中加油” std::vector
vs; // 同质airships集合 vs.push_back(airship1); vs.push_back(airship2); add_oil_to_aircrafts_in_the_sky(vs); // 为airships进行“空中加油”}

 

 

转载于:https://my.oschina.net/u/178323/blog/32945

你可能感兴趣的文章
supervisor命令出现unix:///tmp/supervisor.sock no such file报错
查看>>
让request.is_ajax工作
查看>>
详解TreeMap的红黑树实现
查看>>
LNMP架构
查看>>
MongoDB
查看>>
京东的压测军演系统
查看>>
nginx之fail_timeout和max_fails
查看>>
JQUERY的父,子,兄弟节点查找方法
查看>>
指随心动vi
查看>>
数据验证控件
查看>>
关于Window的Dos Batch 文件编写的常识
查看>>
hbase思维脑图
查看>>
javascript中的一些常用函数
查看>>
负载均衡小demo,未实现session共享
查看>>
Android广播-个人总结
查看>>
redis java客户端Jedis 实现 连接池 + 简单的负载均衡
查看>>
python的string.strip(s[, chars])方法的各种小细节
查看>>
new Date() 在Safari下的 Invalid Date问题
查看>>
Mac OSX升级10.14后,sequel pro关闭时闪退crash解决办法
查看>>
uva 10161 - Ant on a Chessboard
查看>>