解析C++中虚函数
2015-01-30 15:45
183 查看
C++中的一个重要特征是多态即使用同名函数实现不同的功能,多态分为编译时的多态和运行时的多态,编译时的多态主要是指运算符重载和函数重载,而运行时的多态主要是指派生类和虚函数的多态,即使用基类的应用或指针可以引用派生类中的方法(不能引用基类中没有而派生类中新增的方法),如果没有指明是虚函数,指向派生类的指针或引用将会直接调用基类中的方法。这是由于如果定义为虚函数,将会在对象中增加一个虚函数表,来存放虚函数地址,如果派生类重新定义了虚函数,将同时更改虚函数地址,将地址改为指向派生类中的方法。
例如:
运行结果为
如果在show前面增加virtual,基类将会调用派生类的方法
运行结果为
补充:1构造函数不能为虚函数,构造函数不能被重载
2 复制构造函数和运算符不能为虚函数
3析构函数应该为虚函数,销毁派生类应该调用派生类的析构函数,而不能调用基类的析构函数
例如:
#include"stdio.h" #include <iostream> using namespace std; class A { private: char *name; public : A(char *str); A(); void show(); char *getName(); }; A::A() { } A::A(char *str) { name=str; } void A::show() { cout<<"my name is "<<name<<"\n"; } char *A::getName() { return name; } class Singer:public A { public : Singer(char *str); void sing(); void show(); }; Singer::Singer(char *str):A(str) { } void Singer::sing() { cout<<"i can sing"<<"\n"; } void Singer::show() { cout<<"my name is "<<getName()<<"\n"; cout<<"i can sing"<<"\n"; } int main() { A* a1= new Singer("xxz"); a1->show();//基类的引用或指针可以引用派生类中基类的成员 getchar(); return 0; }基类中的show方法没有设为虚函数,则直接调用基类的show
运行结果为
如果在show前面增加virtual,基类将会调用派生类的方法
运行结果为
补充:1构造函数不能为虚函数,构造函数不能被重载
2 复制构造函数和运算符不能为虚函数
3析构函数应该为虚函数,销毁派生类应该调用派生类的析构函数,而不能调用基类的析构函数
相关文章推荐
- 解析C++汇编代码(了解函数在堆栈中的工作流程)-局部变量空间分配及程序栈操作
- C/C++常见无法解析外部函数及其对应Lib汇总 (最后更新日期 17 Nov 2010)
- C++ 函数的重载,覆盖及隐藏解析
- C++中函数模板的用法详细解析
- C++中函数的默认参数详细解析
- C++空类默认函数详细解析
- C++中类的静态数据成员函数解析
- c++中CreateEvent函数解析
- c++中WaitForSingleObject函数解析
- C++ inline函数解析
- c++常见函数解析
- c++中共享内存操作函数MapViewOfFile解析(二)
- c++中共享内存操作函数CreateFileMapping解析(一)
- C++函数签名解析
- C++使用static的错误:无法解析的外部符号、“static”不应在文件范围内定义的成员函数上使用
- 函数的解析之C/C++
- c++中CreateEvent函数解析(2)
- C++ 几种函数的解析
- 深入解析C++中的虚函数与多态
- c++中WaitForSingleObject函数解析