c语言绑定,C++实现动态绑定代码分享
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++实现动态绑定代码分享相关推荐
- C语言编程输入动态数组,C语言完美实现动态数组代码分享
我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量. 这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源. 请实现一个简单的动态数组,能够随时改变大小, ...
- 51单片机如何跳出wile循环_单片机C语言之串口通信协议(代码分享)
原标题:单片机C语言之串口通信协议(代码分享) 现实生活中, 我们总是要与人打交道,互通有无.单片机也一样,需要跟各种设备交互.例如汽车的显示仪表需要知道汽车的转速及电动机的运行参数,那么显示仪表就需 ...
- python有趣的代码-分享几款由quot;Python”语言编写的quot;有趣、恶搞、好玩”的程序代码...
为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代码,感兴趣的小伙伴可以跟着学习借鉴哦!qq进群:156846986可以获取Python学习 ...
- c语言大乐透编译,Excel大乐透摇号vba代码分享,说不定就中百万了呢
大家好我是Excel从零到一,今天闲来无聊做了一套大乐透摇号程序的vba代码分享给大家 来看下效果 Excel大乐透摇号vba代码分享,说不定就中百万了呢 Sub 摇号() Dim i, a, tes ...
- python登录代码思路_用python登录Dr.com思路以及代码分享
用python登录Dr.com思路以及代码分享 发布于 2014-08-28 22:31:52 | 192 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对 ...
- Airlaunch 快捷设置代码分享
Airlaunch 快捷设置代码分享 设置:prefs:root=SETTING 蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID WIFI:prefs:root=WIF ...
- 动图图解C语言插入排序算法,含代码分析
C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...
- php连接数据库语言,PHP语言连接MYSQL数据库实例代码
本文主要向大家介绍了PHP语言连接MYSQL数据库实例代码,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 现在做的项目需要php连接mysql数据库,虽然之前学过,但是现在基本上都给忘 ...
- c语言实现协议层层消息,纯C语言实现面向对象分析与示例分享.pdf
纯C语言实现面向对象分析与示例分享 采用 语言实现的关键是如何运用 语言本身的特性来实现多态.继承面.封装的面向对 C C 象的特征最近给出了例子,大家可以参考使用 , C语言的对象化模型 面向对象的 ...
最新文章
- 【Git】git系统学习(一):常用指令
- Python基础教学系列— 基础语法
- c# 链接mongDB集群实战开发
- SQL Server 2008获取一个表的字段,类型,长度,是否主键,是否为空,注释等信息...
- sql面试语句与后台调用js提示语句
- sap 分摊分配不产生会计凭证的原因_SAP软件的物料分类账功能
- pycharm远程连接服务器(docker)调试+ssh连接多次报错
- “2019大数据与实体经济深度融合全国行”盛大启动
- [转]Java并发编程:线程池的使用
- 他们连忙跟了上去ZuL1VsLa5X67XOI
- 熟悉Jeecg框架、学会环境的搭建及前后端项目(OA)的启动
- 微信看涨跌30秒平台,10元微交易平台排行榜
- layui图标不显示的解决办法
- 类似携程,飞猪机票列表滚动的日期带价格
- safari 调试 打印刚加载界面时缓存的log信息 iOS Safari调试iPhone设备上的网页
- 江在川上曰:JS函数
- pythoncad官网_Pycad: Python Extension for AutoCad
- 调用高德接口查询经纬度(根据地址)
- 24C16 与24C64系列 存储器的区别
- Iptables与Firewalld防火墙(最详细说明)
热门文章
- 刷题总结——road(ssoi)
- Win10怎么打开或关闭自动维护功能
- Windows 0day成功验证之ETERNALBLUE
- Ubuntu 16.04 Steam
- 5-35 有理数均值 (20分)
- WebDev.WebServer.exe遇到问题需要关闭
- windows xp中安装PadWalker
- IP得到天气预报(3)———XML中CDATA的提取
- python3.8对应django版本_Python Django 版本对应表
- Linux先发送条件变量,linux 条件变量 浅谈Linux条件变量的使用