父類物件和子類物件之間可以相互轉換嗎
可以相互轉換。但是若父類物件想轉換為子類物件,父類物件一定是用子類物件初始化的。
那麼父類物件如何用子類物件初始化呢?
假設父類為A,子類為B,那麼用子類初始化程式碼為:
A a=new B()
這就相當於我們用父類的控制代碼指向了子類的空間,如下圖所示:
此時我們若將a強制轉換為子類物件:
B b=(B)a;//相當於B a=new B()
相當於用子類控制代碼指向了子類物件空間,因此只是換了個控制代碼而已!
然而,假如我們的父類未用子類物件初始化:
A a=new A()
這樣如果我們要強轉為子類控制代碼指向子類物件空間,不僅要更換控制代碼,空間也要重新分配,各種變數也要重新初始化,開銷很大,編譯器不會允許通過的。
而若是子類物件轉父類物件,只需更換控制代碼使父類控制代碼指向子類物件空間即可。
注意:實際是父類控制代碼指向子類物件空間,所以使用的屬性和方法都是子類物件所有的。而因為是父類的控制代碼指向的只能是父類所擁有的屬性和方法,所以指向的屬性和方法實則又必須是是從父類繼承而來的。
相關推薦
父類物件和子類物件之間可以相互轉換嗎
可以相互轉換。但是若父類物件想轉換為子類物件,父類物件一定是用子類物件初始化的。 那麼父類物件如何用子類物件初始化呢? 假設父類為A,子類為B,那麼用子類初始化程式碼為: A a=new B() 這就相當於我們用父類的控制代碼指向了子類的空間,如下圖所示:
對用父類指標(或引用)指向父類物件和子類物件時,從而用父類指標或者引用訪問成員時的深刻理解;
賦值相容規則永遠不變,父類指標既可以指向父類物件,也可以指向子類物件;當父類指標指向父類物件時,訪問父類的成員;當父類指標指向子類物件時,那麼只能訪問子類中從父類繼承下來的那部分成員;不能訪問子類獨有的
關於父類元件和子類元件的互相傳值
第一步:子類向父類傳值 在java中父類是可以將值傳給子類的,但是卻不能從子類拿到值,同理子類是可以將父類的值拿到手,但是卻不能將自己的值傳給父類 而在vue中,子類和父類之間是不允許傳值的但是,我們可以利用關聯和引用來讓他們之間建立起一些聯絡 子類向父類傳值要使用$e
C#中父窗口和子窗口之間控件互操作實例
child title 成員 img dddddd idt 函數 通過 plugin 本文實例講述了C#中父窗口和子窗口之間控件互操作的方法。分享給大家供大家參考。具體分析如下: 很多人都苦惱於如何在子窗體中操作主窗體上的控件,或者在主窗體中操作子窗體上的控件。相比較而言
Vscode DOS和UNIX指令碼檔案之間相互轉換的多種方法
DOS和UNIX指令碼檔案之間的轉換 DOS和UNIX指令碼檔案之間的轉換 vscode dos2unix perl vim awk sed tr
Java——超類和子類物件之間的轉換
繼承是Java中常用的一項特性,通過繼承我們可以省去很多麻煩。 而Java中超類和子類物件之間的轉換則是很多新手的常遇見的難題,要是處理不好,恐怕會因為這個很特殊的問題導致一些潛在的危險,讓你整整一個晚上都在除錯程式以解決一個讓人抓狂的java.lang.ArrayStoreException異
C#中父類和子類之間相互轉換
mage all spa 分享 mic ack 子類 utl round 所用到的類文件:Person.cs:Student.cs:Teacher.cs:問題1:總結:1 父類不能直接強制轉換成子類2 只有父類對象指向子類,那麽父類是可以強制轉換成子類,如果父類對象沒有指向
javascript面向物件程式設計--設計超類和子類,設計元類
在javascript中,Object物件是通用類,其他所有內建物件和自定義構造物件都是專用類,即Object物件是超類,其他內建物件和自定義物件都是Object的子類,所有在javascript語言中,所有的物件都繼承Object定義的屬性和方法 Object.prototype.name='
父類物件變成子類物件
&nb
c++父類指標指向子類物件
c++父類指標指向子類物件 父類子類指標函式呼叫注意事項 1,如果以一個基礎類指標指向一個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(靜態聯翩) 2,如果以一個衍生類指標指向一個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很
關於父類引用指向子類物件
以下內容參考https://www.cnblogs.com/ChrisMurphy/p/5054256.html 父類引用指向子類物件指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是介面,Cat和Dog是繼承或實現Animal的子類。 Animal animal =
JAVA學習筆記 物件的上轉型物件(子類物件當作父類物件來使用)
世界萬物無非就是吃喝玩樂繁衍生息,傳宗接代是重中之重,這樣長久以來就構成了我們地球上的生態系統,java也是這樣,只不過這裡面更加直接和純粹,就用學生和人類做一下例子,學生一定是人類對吧?(苗紅根正的當代優秀青年不相信怪力亂神)所以說人類一定就是學生的父類,學生就是人類的子類。大圓之中
【C++學習筆記】父類指標指向子類物件
虛擬函式的作用主要是實現了多型的機制。簡而言之就是用父型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。但僅僅可呼叫父類含有的函式,非父類函式不能呼叫。 普通虛擬函式呼叫 假設我們有下面的類層次: #includ
面向物件-在子類使用父類的物件或屬性
在子類派生出的新方法中 重用父類分方法,有2種 1、指名道姓(不依賴繼承) 2、super()依賴繼承 在子類派生出的新方法中 重用父類分方法,有2種 #1、指名道姓(不依賴與繼承) class Hero: def __init__(self,nickname,li
面向物件三大特徵,super關鍵字,以及父類引用指向子類物件。訪問許可權的大小。
一.封裝,反射的時候在詳細補充。 二.繼承 補充:子類的訪問許可權一定要大於等於父類。 訪問許可權的優先順序順序:public(在哪裡都可以訪問)>protected(保護的意思,子類可以訪問,但是子類的許可權要大於父類的許可權,這是首要條件,否者子類依舊訪問不到)
多型的理解(父類引用指向子類物件)
多型:要有繼承,方法的重寫,父類引用指向子類物件 ?疑問:Animal cat = new Cat(); //向上轉型。 父類引用指向子類物件,該引用不能再訪問子類新
當父類指標指向子類物件時的函式呼叫
class A { public: void FuncA() { printf( "FuncA called\n" ); } virtual void FuncB() { printf( "FuncB called\n" ); } }; cl
c++——繼承類中的子物件和基類物件的初始化
先給結論: (1)派生類中的基類子物件和子物件必須初始化,初始化在派生類的建構函式的初始化列表中,如果初始化列表中沒有進行初始化,則呼叫預設的建構函式進行初始化。 (2)派生類建構函式的呼叫順序: 基類的建構函式 子物件類的建構函式 派生類的建構函式 例子
子類物件呼叫父類方法包含子類覆蓋的方法
如果A類中的fa和B類中的fb命名相同,均為f,則在B類物件呼叫f方法時,會出現邏輯錯誤,因為呼叫super.f(a,b)後,父類方法中return f(a,b%a);呼叫的將不是父類中自身的方法,而是子類中被覆蓋的方法。 子類型別物件呼叫子類覆蓋父類的方
Java反射通過父類物件呼叫子類的方法
在做網站開發的時候我們都會寫一個控制器,控制器的作用就是接收客戶端的請求,有時候為了控制訪問入口的唯一性,方便我們監控使用者訪問的資料;最近在抽時間寫一個底層轉發控制器請求的工具,說通俗一點就是首先我定義一個抽象類或者介面A(實現類A就標識為控制器),然後定義很