C++中的一个重要特征是多态即使用同名函数实现不同的功能,多态分为编译时的多态和运行时的多态,编译时的多态主要是指运算符重载和函数重载,而运行时的多态主要是指派生类和虚函数的多态,即使用基类的应用或指针可以引用派生类中的方法(不能引用基类中没有而派生类中新增的方法),如果没有指明是虚函数,指向派生类的指针或引用将会直接调用基类中的方法。这是由于如果定义为虚函数,将会在对象中增加一个虚函数表,来存放虚函数地址,如果派生类重新定义了虚函数,将同时更改虚函数地址,将地址改为指向派生类中的方法。
例如:
#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析构函数应该为虚函数,销毁派生类应该调用派生类的析构函数,而不能调用基类的析构函数
时间: 2024-10-13 12:16:54