C++实现动态绑定代码分享

#include

#include

using namespace std;

class BookItem

{

private:

string bookName;

size_t cnt;

public:

BookItem(const string&s,size_t c,double p):

bookName(s),cnt(c),price(p)

{}

~BookItem(){}

protected:

double price;

public:

double bookPrice()

{

return this->price;

}

string getBookName()

{

return this->bookName;

}

size_t getBookCount()

{

return this->cnt;

}

virtual double money()

{

return cnt*price;

}

virtual void costMoney()

{

cout<

}

};

class BookBatchItem:public BookItem

{

private:

string bookName;

size_t cnt;

public:

BookBatchItem(const string&s,size_t c,double p,double discountRate):

BookItem(s,c,p),cnt(c),discount(discountRate)

{}

~BookBatchItem(){}

private:

double discount;

public:

double money()

{

if(cnt>=10)

return cnt*price*(1.0-discount);

else

return cnt*price;

}

void costMoney()

{

cout<

// cout<

// cout<

// cout<

// cout<

}

};

int main()

{

BookItem b1("Uncle Tom's house",11,12.5);

b1.costMoney();

BookBatchItem b2("Gone with wind",11,12.5,0.12);

b2.costMoney();

BookItem* pb=&b1;

pb->costMoney();

pb=&b2;

pb->costMoney();

return 0;

}

只有采用“指针->函数()”或“引用.函数()”的方式调用C++类中的虚函数才会执行动态绑定,非虚函数并不具备动态绑定的特征,不管采用任何方式调用都不行。

下面代码中,一个java或者C#的程序员容易犯的一个错误。

class Base

{

public:

Base() { p = new char ; }

~Base() { delete p; }

private:

char * p ;

};

class Derived:public Base

{

public:

Derived() { d = new char[10] ; }

~Derived() { delete[] d; }

private:

char * d ;

};

int main()

{

Base *pA = new Derived();

delete pA ;

Derived *pA = new Derived();

delete pA ;

}

代码中:

执行delete pA时,直接执行~Base析构函数,不会执行~Derived析构函数的,原因在于析构函数不是虚函数。

执行delete pB时,先执行~Derived()然后再执行~Base()。

相比之下,java和C#中,所有的函数调用都是动态绑定的。

关于C++的成员函数调用与绑定方式,可以通过下面的代码测试:

class Base

{

public:

virtual void Func() { cout<

};

class Derived:public Base

{

public:

virtual void Func() { cout<

};

int main()

{

Derived obj;

Base * p1 = &obj;

Base & p2 = obj;

Base obj2 ;

obj.Func() ; //静态绑定,Derived的func

p1->Func(); //动态绑定,Derived的func

(*p1).Func(); //动态绑定,Derived的func

p2.Func(); //动态绑定,Derived的func

obj2.Func(); //静态绑定,Base的func

return 0 ;

}

可以看出“对象名.函数()”属于静态绑定,当然,使用指针转换为对象的方式应该属于指针调用那一类了,至于“类名::函数()”毫无疑问属于静态绑定。

c语言绑定,C++实现动态绑定代码分享相关推荐

  1. C语言编程输入动态数组,C语言完美实现动态数组代码分享

    我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量. 这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源. 请实现一个简单的动态数组,能够随时改变大小, ...

  2. 51单片机如何跳出wile循环_单片机C语言之串口通信协议(代码分享)

    原标题:单片机C语言之串口通信协议(代码分享) 现实生活中, 我们总是要与人打交道,互通有无.单片机也一样,需要跟各种设备交互.例如汽车的显示仪表需要知道汽车的转速及电动机的运行参数,那么显示仪表就需 ...

  3. python有趣的代码-分享几款由quot;Python”语言编写的quot;有趣、恶搞、好玩”的程序代码...

    为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代码,感兴趣的小伙伴可以跟着学习借鉴哦!qq进群:156846986可以获取Python学习 ...

  4. c语言大乐透编译,Excel大乐透摇号vba代码分享,说不定就中百万了呢

    大家好我是Excel从零到一,今天闲来无聊做了一套大乐透摇号程序的vba代码分享给大家 来看下效果 Excel大乐透摇号vba代码分享,说不定就中百万了呢 Sub 摇号() Dim i, a, tes ...

  5. python登录代码思路_用python登录Dr.com思路以及代码分享

    用python登录Dr.com思路以及代码分享 发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对 ...

  6. Airlaunch 快捷设置代码分享

    Airlaunch 快捷设置代码分享 设置:prefs:root=SETTING 蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID WIFI:prefs:root=WIF ...

  7. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  8. php连接数据库语言,PHP语言连接MYSQL数据库实例代码

    本文主要向大家介绍了PHP语言连接MYSQL数据库实例代码,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 现在做的项目需要php连接mysql数据库,虽然之前学过,但是现在基本上都给忘 ...

  9. c语言实现协议层层消息,纯C语言实现面向对象分析与示例分享.pdf

    纯C语言实现面向对象分析与示例分享 采用 语言实现的关键是如何运用 语言本身的特性来实现多态.继承面.封装的面向对 C C 象的特征最近给出了例子,大家可以参考使用 , C语言的对象化模型 面向对象的 ...

最新文章

  1. 【Git】git系统学习(一):常用指令
  2. Python基础教学系列— 基础语法
  3. c# 链接mongDB集群实战开发
  4. SQL Server 2008获取一个表的字段,类型,长度,是否主键,是否为空,注释等信息...
  5. sql面试语句与后台调用js提示语句
  6. sap 分摊分配不产生会计凭证的原因_SAP软件的物料分类账功能
  7. pycharm远程连接服务器(docker)调试+ssh连接多次报错
  8. “2019大数据与实体经济深度融合全国行”盛大启动
  9. [转]Java并发编程:线程池的使用
  10. 他们连忙跟了上去ZuL1VsLa5X67XOI
  11. 熟悉Jeecg框架、学会环境的搭建及前后端项目(OA)的启动
  12. 微信看涨跌30秒平台,10元微交易平台排行榜
  13. layui图标不显示的解决办法
  14. 类似携程,飞猪机票列表滚动的日期带价格
  15. safari 调试 打印刚加载界面时缓存的log信息 iOS Safari调试iPhone设备上的网页
  16. 江在川上曰:JS函数
  17. pythoncad官网_Pycad: Python Extension for AutoCad
  18. 调用高德接口查询经纬度(根据地址)
  19. 24C16 与24C64系列 存储器的区别
  20. Iptables与Firewalld防火墙(最详细说明)

热门文章

  1. 刷题总结——road(ssoi)
  2. Win10怎么打开或关闭自动维护功能
  3. Windows 0day成功验证之ETERNALBLUE
  4. Ubuntu 16.04 Steam
  5. 5-35 有理数均值 (20分)
  6. WebDev.WebServer.exe遇到问题需要关闭
  7. windows xp中安装PadWalker
  8. IP得到天气预报(3)———XML中CDATA的提取
  9. python3.8对应django版本_Python Django 版本对应表
  10. Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用