關於C++虛函數,純虛函數以及模板等重要概念的深刻討論(一)

1.虛函數ios

        虛函數主要利用在多態的實現上,當基類的成員函數爲虛函數時,它的子類函數若是也實現了這個虛函數,那麼就能夠實現多態的功能。app

// Test1.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "iostream"
using namespace std;


class A
{
private:
 int valueA;
public:
 A();
 A(int value);
 ~A();
 virtual void print();
};
//The class A realize.
A::A()
{
 valueA = 0;
}
A::A(int value)
{
 valueA = value;
}
A::~A(){}
void A::print()
{
 cout << "This is A print and Value is :" << valueA <<endl;
}

class B:public A
{
private:
 int valueB;
public:
 B();
 B(int value);
 ~B();
        void print();
 void draw();
};
//The class B realize.
B::B()
{
 valueB = 0;
}
B::B(int value):A(value)
{
 valueB = value;
}
B::~B(){}
void B::print()
{
 cout << "This is B print and Value is :" << valueB << endl;
}
void B::draw()
{
 cout << "This is B draw and Value is :" << valueB << endl;
}
int main(void)
{
 A *objectA = new A(10);
 B *objectB = new B(20);
 A *objectC = objectB;

 objectA->print();
 objectB->print();
 objectC->print();
 return 0;
}

上述代碼輸出爲:函數

          

    從而咱們能夠清楚的看出objectC雖然屬於A類的,可是因爲多態的原理,A類中的print函數被B類給重載了,從而objectC輸出的便是B類的print;還有一點值得注意要的是虛函數能夠傳參,但最好不要帶有默認參數,不然會形成誤解,假若咱們將print函數傳入默認參數,main函數不變的話,代碼以下(這裏只寫了A,B也應同理的改寫print函數並將默認參數設爲3):spa

class A
{
private:
	int valueA;
public:
	A();
	A(int value);
	~A();
	virtual void print(int value = 1);
};
//The class A realize.
A::A()
{
	valueA = 0;
}
A::A(int value)
{
	valueA = value;
}
A::~A(){}
void A::print(int value)
{
	cout << "This is A print and Value is :" << value <<endl;
}

那麼輸出的結果爲:指針

        

    會驚訝的發現不是說好的:objectC輸出的是B類的print的麼?從而objectC不是應該輸出爲3麼?爲何會這樣呢?答案是函數依然調用的是B的print然而傳參是A的print函數的參數;這就是爲何不建議爲虛函數設置默認參數的緣由所在。code

2.析構與虛析構函數對象

    普通的析構函數如上例:~A(); 而後在實現它的地方執行內存釋放等操做。而虛析構函數爲:virtual ~A(); 即在析構函數前加入關鍵字virtual便可。一般在編寫程序的過程當中要求基類的析構函數必須爲虛析構函數(抱歉上述代碼本人沒有按要求使用用虛析構函數,正常必須使用虛析構)。緣由其實從上面的小節中就可知道,當實現多態時,即利用相似指針 objectC這種方式的時候,當objectC對象處理完了,須要調用析構的時候,這時候實際上在調用A的析構函數時,咱們一樣也要調用B的析構函數,普通的析構函數無法實現,而虛析構函數卻能夠順利的實現,具體原理若是你完全明白第一節的內容就會明白虛析構函數的緣由,所以切記在編寫程序的時候基類的析構函數必須爲虛析構函數!!內存

<未完待續>io

相關文章
相關標籤/搜索