c++中各种“虚”的概念
来源:互联网 发布:账号自动登录软件 编辑:程序博客网 时间:2024/06/03 16:59
最近温习了一下c++,本文主要是对c++中一些虚的概念进行一下简单的整理和比较,c++是面向对象的这个大家都知道,既然面向对象那就肯定离不开继承和多态。
继承,只要你学习过面向对象的语言肯定就知道这个概念了,c++和其他一些高级语言不同的是c++中可以多继承(c#,java等不允许多继承),那么多继承就会出现一个问题,嘛问题,看代码吧:
class Employee {//职工 public: void pay()//支付月薪 { cout<<"哎呀,employee,要发工资了"<<endl; }};class Technical: public Employee {//技术,也是职工};class Manager: public Employee {//经理,也是职工};class TechnicalManager:public Technical,public Manager {//技术经理,也是职工};int main(int argc, const char * argv[]){ TechnicalManager tManager; tManager.pay();//此处编译错误 return 0;}
上面的代码很简单,之所以出现错误是因为TechnicalManager中存在两个pay函数(一个是Technical类中的pay,另一个是Manager类中的pay),通过TechnicalManager的对象tManager来调用pay,编译器不知道应该调用那个pay,所以编译器就会爆出错误,如果代码改为tManager.Technical::pay()或者tManager.Manager::pay()编译器就不会报错,就是说子类TechnicalManager对象在内存中同时存在pay的两份copy,但是很多情况下我们只需要一个这样的数据copy,多分拷贝增加了内存的开销,这就引入了本文的第一种“虚”
1,虚基类
说白了,虚基类就是解决多继承派生类对象存在基类的成员多分copy问题了,上面的代码改为
class Employee {//职工 public: void pay()//支付月薪 { cout<<"哎呀,employee,要发工资了"<<endl; }};class Technical: virtual public Employee {//技术,也是职工};class Manager: virtual public Employee {//经理,也是职工};class TechnicalManager:public Technical,public Manager {//技术经理,也是职工};int main(int argc, const char * argv[]){ TechnicalManager tManager; tManager.pay(); return 0;}
多态,即同样的消息被不同类型的对象接受时导致不同的行为,下面例子:
class Employee { public: void pay() { cout<<"哎呀,Employee,发工资了"<<endl; }};class Technical: public Employee { public: void pay() { cout<<"哎呀,Technical,发工资了"<<endl; }};class Manager: public Employee { public: void pay() { cout<<"哎呀,Manager,发工资了"<<endl; }};void fun(Employee *ptr){ ptr->pay();}int main(int argc, const char * argv[]){ Employee *pEmployee; Technical technical; pEmployee = &technical; fun(pEmployee); Manager manager; pEmployee = &manager; fun(pEmployee); return 0;}
终端输入结果:
哎呀,Employee,发工资了
哎呀,Employee,发工资了
,这不是大家想要的,这是多态吗?当然不是,这里的绑定是静态绑定,即编译时系统就根据类型匹配来确定程序中调用与执行的关系。
2。虚函数:c++支持多态主要就是靠虚函数,这事本文第二种“虚”,将上面的Employee 的pay方法前添加virtual,该函数就是虚函数了
class Employee { public: virtual void pay() { cout<<"哎呀,Employee,发工资了"<<endl; }};
终端输入结果:
哎呀,Technical,发工资了
哎呀,Manager,发工资了
呵呵,这下ok了吧,虚函数其实就是动态绑定,即在程序运行时才确定程序中调用与执行的关系
3。纯虚函数,最后一种虚
上面的代码中你会发现,Employee中的pay就没有用过,并且也不需要用到,因为你进入公司要么就是Technical(技术)要么就是TechnicalManager(技术经理),(假如你是搞技术的),Employee对公司所有的员工都适合,但是Employee中声明的pay函数目的只是为整个类族规定统一的对外接口功能,所以pay的实现就显得多余了,这样c++中就有了纯虚函数的概念,纯虚函数的格式就是该函数不给出实现,函数后面追加 “=0”,
如
class Employee { public: virtual void pay() = 0;};
类中包含纯虚函数的类就是抽象类,抽象类不能够实例化,这些都符合我们对Employee的要求。
- c++中各种“虚”的概念
- java(jsp)中各种概念的比较
- java(jsp)中各种概念的比较
- java(jsp)中各种概念的比较
- unity3d中各种概念
- c中各种++的比较
- 各种连接的概念
- Qt的各种概念
- 各种概念的龙头股
- Docker的各种概念
- 各种树的概念
- vga的各种概念
- C语言中对齐概念的理解
- 理解c中堆栈的概念
- 转载object-c中selector的概念
- Objective-C 中 selector的概念
- c语言中容易混淆的概念
- C中关于常量的概念
- CSDN第二次培训第一课感受
- linux下Bluetooth
- MyEclipse集成Python
- 关于sizeof 各类型大小、类的大小
- Spring配置文件总结
- c++中各种“虚”的概念
- MyEclipse10 开发 SSH2(Struts2.1+Spring+Hibernate)
- HttpComponents(Apache HttpComponents Client 4.1.3)通过代理访问网页的设置方法
- Android使用ApacheFtpServer实现Ftp服务器
- android之AlerDialog
- 【JS】There’s Nostalgia in the Waters of Lake.js
- Tomcat性能调优方案
- Android闹钟程序周期循环提醒源码(AlarmManager)
- Android屏幕点亮(常亮)及屏幕解锁和锁定