日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++类的使用(六)—— 判断继承

發布時間:2024/9/30 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++类的使用(六)—— 判断继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相信通過之前的學習,你也已經對類有了深刻的了解,那么請利用你所學的知識,想一想下面這道題。

/* 函數名: foo* 函數聲明:* template <class B, class D>* bool foo();* 函數注解:* B代表判斷基類* D代表判斷子類* foo返回一個布爾值* 如果D是B的子類,返回true* 如果D不是B的子類,返回false*/

很新奇的題目吧,你可能一下子被蒙住了。這道題牽涉到函數重載(overload),下面就是本題答案。

/* 函數名: foo* 函數聲明:* template <class B, class D>* bool foo();* 函數注解:* B代表判斷基類* D代表判斷子類* foo返回一個布爾值* 如果D是B的子類,返回true* 如果D不是B的子類,返回false*/template <class B, class D> class Inherit { public:bool result(); protected:bool foo(B *var);bool foo(void *var); }; bool Inherit::result() {D *d = 0;return foo(0); } bool Inherit::foo(B *var) {return true;} bool Inherit::foo(void *var) {return false;}template <class B, class D> bool foo() {return Inherit<B,D>().result();}

思路就是,通過函數重載,對于B的子類,將調用bool foo(B *var),對于其他類型,將調用bool foo(void *var)
這是因為從子類指針到父類指針比從指針到void *的距離短
當然我一開始也并不覺得是這樣,因為這怎么又可比性呢?我認為會報錯的。
但我親自嘗試了一下,發現確實可行。

再來一道和多態有關的。

/* 函數名: foo* 函數聲明:* template <class B, class D>* bool inherits(B *var);* 函數注解:* B代表判斷子類* D代表判斷基類* D一般是B的子類(不一定是)* var的類型可以是B,也可以是B的子類(多態)* 如果var的類型是D的子類,foo返回true* 如果var的類型不是D的子類,foo返回false*/

這道題有點繞,舉個例子

class A {}; class B: public A {}; class C {};int main() {A *a = new B;foo<B>(a); // 返回true,因為a的類型是B,B是B的子類foo<C>(a); // 返回false,因為a的類型是B,B不是C的子類B *b = new B;foo<A>(b); // 返回true,因為b的類型是B,B是A的子類delete a.b; }

就需要滿足上述的效果。
這道題要用到動態類型轉換(dynamic cast),你可能不知道

template <class B, class D> bool foo(B *var) {D *d = dynamic_cast<D *>(var);return !!d; }

代碼很短,主要是第3行的dynamic_cast,這個運算符可以幫助我們判斷var是不是D的子類
dynamic_cast允許把一個原本為子類的父類變量轉為原本類型的父類。
聽起來有點繞口,其實很簡單。
假如A->B->C,即C是B的子類,B是A的子類
現有變量C *var,利用多態特性轉換為A *var,那么我們就不能直接看出var是否繼承B,這時dynamic_cast可以試圖將var轉換為B *類型,如果成功,返回轉換后的值,如果失敗,返回空指針。
這就正好滿足了我們的需求。
但dynamic_cast運行較慢,好像是通過源代碼查找的方式確定的。
所以能用第一種就用第一種。

本序列的文章:
C++類的使用(一)
C++類的使用(二)—— explicit構造與const成員變量賦值
C++類的使用(三)—— 封裝
C++類的使用(四)—— 繼承
C++類的使用(五)—— 多態
C++類的使用(六)—— 判斷繼承

總結

以上是生活随笔為你收集整理的C++类的使用(六)—— 判断继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。