解析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析構函數應該爲虛函數,銷燬派生類應該調用派生類的析構函數,而不能調用基類的析構函數   

    



發佈了38 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章