您的位置:首页 > 编程语言 > C语言/C++

解析C++中虚函数

2015-01-30 15:45 183 查看
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析构函数应该为虚函数,销毁派生类应该调用派生类的析构函数,而不能调用基类的析构函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: