C 多繼承的型別轉換中遇到的問題 待續

2021-08-10 07:17:00 字數 1344 閱讀 2680

今天在寫**時遇到這麼乙個問題,與多繼承的型別轉換相關。

公司現在開發乙個系統,在公共段有對外介面gobject,還有乙個對內的介面gobjectex繼承自gobject。

我自己的工程有乙個對外的介面cobject繼承自gobject,實現類cobjectex繼承自gobjectex和cobject。

類的繼承關係如下:

當我new了cobjectex物件後,無法通過dynamic_cast將其直接轉換成它的父類gobject,轉換後物件為null。

但是當進行兩次動態轉換即先dynamic_cast成cobject,然後再dynamic_cast成gobject就可以獲取到gobject的物件。

推測不能直接轉換成功的原因是:

1、型別轉換不能跨越分支。即:可以沿著一條線進行型別轉換,但是當線有分支時,編譯器不清楚應選擇哪種路線進行型別轉換(因為如果任意選擇一條路線轉換成父類後,在下文再轉換成子類,就會造成困擾),因此返回null。

那麼應該如何設計這個繼承結構呢?

我覺得我們這麼設計介面是沒有問題的,問題出在我們沒有將對外和對內的介面函式分開。

我們是這麼設計介面函式的,單獨以cobjectex為例,kobjectex和它類似:

cobjectex* cobject = new cobjectex();   //單例

extern

"c" __declspec(dllexport) gobject* creategobject()

實現類cobjectex和kobjectex都會實現這個creategobject(),在內部呼叫時會將其動態轉換成gobjectex*,這樣就出現了最開始說的轉換失敗的問題,因為這麼做連creategobject返回的值都為null,更別提再將它轉為gobjectex。

我的解決方案:

將對外介面和對內介面分開,單獨以cobjectex為例,kobject和它類似:

cobjectex* cobject = new cobjcetex();    //單例

extern

"c" __declspec(dllexport) gobject* creategobject()

extern

"c" __declspec(dllexport) gobjectex* creategobjectex()

不知這麼設計是否合適,還沒有抽空研究c++多繼承的型別轉換的原理,今晚現將我暫時想到的解決辦法記錄下來,希望對此有所研究的朋友能夠多多指點。

python中多繼承的問題 比較C 的多繼承

python的多繼承類是通過mro的方式來保證各個父類的函式被逐一呼叫,而且保證每個父類函式都只被呼叫一次 和c 不同的是 1.如果子類中沒有作顯示呼叫!並且父類的構造 init 中不需要傳入額外的引數。那麼,很明顯的,父類的 init 不會被呼叫 class a def init self pri...

C 中的多繼承

在學習c 的過程中多繼承和多重繼承很重要,下邊就自己的學習過程講解一下c 中的繼承問題 多繼承問題,先來看一段程式 include using namespace std class cbase cbase virtual void f1 void f2 class www www class cs...

C 中繼承中遇到的建構函式問題

今天在開發時遇到了乙個之前一直以為理所當然的建構函式問題。先給總結 子類在構造時,如果沒有顯式呼叫父類的建構函式,會先呼叫父類的預設建構函式 無引數的 下面給出不同情況的例子 例子一 父類有預設的建構函式,子類的建構函式隨便 include class base class derive publi...