c++虚函数机制
来源:互联网 发布:阿里云oss客户端 编辑:程序博客网 时间:2024/05/20 14:24
RT。。面试常问的题
This is A..
This is A..
首先c++的虚函数机制是用来实现面向对象编程时的多态机制的。多态(Polymorphism)是允许你将父对象设置成为与一个或更多的他的子对象相等的技术。
简单的说:就是允许将子类类型的指针赋值给父类类型的指针。这样在定义一个基类的指针对象p1后,可以通过p1来调用各个子类的函数以实现对基类函数的重写。
示例代码1:
#include<iostream>using namespace std;class A{public: void print() { cout<<"This is A.."<<endl; }};class B:public A{public: void print() { cout<<"This is B.."<<endl; }};int main(){ A a; B b; a.print(); b.print();}运行结果:
This is A..
This is B..
确切的说,虽然输出结果不同,但这里并不叫真正实现了多态。原因是多态还有1个关键之处,就是一切用指向基类的指针或引用来操作对象,以实现对基类函数的重写。
于是把上面的代码改成按指针引用,变成示例代码2:
#include<iostream>using namespace std;class A{public: void print() { cout<<"This is A.."<<endl; }};class B:public A{public: void print() { cout<<"This is B.."<<endl; }};int main(){ A a; B b; A* p1 = &a;//这里改写成按指针传递而类中声明和实现的部分不变 A* p2 = &b; p1->print(); p2->print();}输出结果为:
This is A..
This is A..
为了解决基类按指针也能实现对各个子类函数的调用以输出不同的结果,这时候需要用到c++的关键字virtual . 直接加在基类的函数前即可(基类若是定义成纯虚函数,则子类中对应的函数全部默认为虚函数,不用再加关键字)。
示例代码3:
#include<iostream>using namespace std;class A{public: virtual void print() //这里与示例2相比改成纯虚函数即可 { cout<<"This is A.."<<endl; }};class B:public A{public: void print() { cout<<"This is B.."<<endl; }};int main(){ A a; B b; A* p1 = &a; A* p2 = &b; p1->print(); p2->print();}运行结果即为:
This is A..
This is B..
示例3才叫真正实现了多态。
另外,如果只想在基类中声明一个纯虚函数而不实现它,只需在函数后面加入"=0"即可。基类的函数声明成纯虚函数后,就可以在继承自它的子类下实现对基类函数的重写。
示例代码4:
#include<iostream>using namespace std;class A{public: virtual void print()=0;//这里只声明不写实现 /*{ cout<<"This is A.."<<endl; }*/};class B:public A{public: void print() { cout<<"This is B.."<<endl; }};int main(){ //A a; B b; //A* p1 = &a; A* p2 = &b; //p1->print(); p2->print();}输出结果即为:
This is B..
- 【C++】C++ 虚函数的实现机制
- C函数调用机制
- C函数调用机制
- C函数调用机制
- linux c函数调用机制
- C语言函数调用机制
- C语言函数副本机制
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- C语言函数调用的底层机制
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- 简析C中的函数调用堆栈机制
- C/C++中的函数参数传递机制
- C/C++中的函数参数传递机制
- C语言函数调用的底层机制
- Objective-C函数消息机制的理解
- nyoj-889-求距离
- 【进制转换】
- java的this和super的使用详解
- Android ADT离线安装步骤及注意点
- (+)第113天的交易(2013-11-8)(+50)(345)(非农夜)
- c++虚函数机制
- bootsect.S分析(一篇老东东)
- 成才之路(1):社会、家庭、自我
- understanding eigrp soo bgp cost community
- 缓存不可变类实例的不可变类【参考疯狂Java讲义】
- C中的命令行中如果本身参数有空格怎么处理(更新中。。)
- Oracle数据库SQL语句性能调整的基本原则
- 成才之路(2):养成自由思考的习惯
- OWL API简单入门与使用