1. 程式人生 > >C++父類子類轉化及函式呼叫

C++父類子類轉化及函式呼叫

     這些天分析OGRE原始碼,裡面有關C++繼承及父類子類轉化運用,筆記記錄如下:

一 子類轉化父類

     這裡的”轉化“不是真正的轉化,是一種形式上的轉化,主要用於多型,定義父子類函式如下:

#include "stdafx.h"
#include <iostream>
using namespace std;
class Base {
private:
   int number;
public:
	Base(){
		number = 15;
	}
   virtual void test() {
	    std::cout << "Base test\n" << number << std::endl;
    }
	void write() {
		std::cout << "Base  write" << std::endl;
   }
};
class Derived :public Base {
public:
	int addData;
	Derived(){
        addData = 20;
		number = 19;
	}
	void test() {
		std::cout << "Derived test\n" << number<< std::endl;
	}
	void addTest()
	{
		std::cout << "Add test" << std::endl;
	}
	void testData()
	{
		std::cout << "Test Data" << addData<<std::endl;
	}
	void write() {
			std::cout << "Derived  write"<< std::endl;
	}
};
int main()
{
    Derived *derive=new Derived();
	Base *base = derive;
	base->write();
	derive->write();
	base->test();
	derive->test();
}

     base能實現父類中定義的所有方法,如果是虛擬函式,它呼叫會子類的實現(test()函式),否則呼叫父類的實現(write()函式),在執行過程中,會先呼叫BASE的建構函式,然後呼叫Derived的建構函式,因此這裡的Number為19,除了能執行子類的虛擬函式和建構函式外,其它子類函式均不能呼叫,如base->test1()不能呼叫 ,需要轉換為子類才能執行。

二,父類轉化為子類

    一般情況下,父類不能向子類轉化,因為子類中存在比父類更多的資料,轉換後這些資料是未知的。但是如果訪問子類定義的變數,轉換後子類可以子類的函式。

int main()
{
	Base *base = new Base();
	Derived *derive = (Derived*)base;
	derive->addTest();
	derive->testData();
}

    執行結果如下,可以發現,父類強制強制轉換子類物件後,可以呼叫子類物件函式,只是新增的資料為未賦值。

     另外一種情況轉換後不會出現上面未賦值的情況,那就是父類本來就指向之類,這樣再次轉換子類後就不會出現訪問不了子類物件的問題。

int main()
{
	Base *base = new Derived();
	Derived *derive = (Derived*)base;
	derive->addTest();
	derive->testData();
}

     這種情況轉換後的子類就不會出現問題。

     

小記:

       純虛擬函式(方法:virtual ReturnType Function()= 0;)有純虛擬函式的為抽象類,直到所有純虛擬函式都實現後,這個類才可以具體化。如果子類和父類中都是實現了某個方法,在子類中想呼叫父類的方法取樣Base ::函式名的方法實現。

C++支援兩種多型性:編譯時多型性執行時多型性

a.編譯時多型性:通過過載函式和運算子過載實現。

b執行時多型性:通過虛擬函式和繼承實現。