首页 > 代码库 > 解析C++中虚函数

解析C++中虚函数

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析构函数应该为虚函数,销毁派生类应该调用派生类的析构函数,而不能调用基类的析构函数   

    



解析C++中虚函数