C++父類子類轉化及函式呼叫
阿新 • • 發佈:2019-01-02
這些天分析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 ::函式名的方法實現。
b執行時多型性:通過虛擬函式和繼承實現。