[英]How can I best use polymorphism on incomplete types in C++
我一直在尋找stackoverflow和google已有一段時間了,但是我似乎找不到關於循環引用,不完整類型和多態性的具體問題的答案。
希望我能在不發布大量代碼的情況下解釋這個問題,但是如果失敗,請告訴我,我將嘗試寫下一個簡單的示例。
我有2個類,它們都互相使用(比如類COne和CTwo)。 而且,COne類具有基類(例如BaseOne)。
我使用標頭保護符(如果您稱呼它們)和不完整的類型來“解決”循環依賴問題。
在頂部的頭文件中:
#pragma once
在CTwo的C ++文件頂部的某個位置:
class COne;
現在,我遇到一個問題,由於類型不完整,編譯器似乎不知道COne是從BaseOne派生的。 因此,在一個具有返回類型BaseOne *的函數中,我想返回一個COne *,這應該是可能的,因為它是一個低調的選擇,但是它說它們不是同一類型。 我現在使用C風格的演員表修復了此問題
return (BaseOne*)m_c_one;
我想問的是:是否有比使用C樣式轉換更好的方法來解決此問題?
C樣式COne
是不安全的,因為不能保證COne
對象及其BaseOne
子對象具有相同的內存地址(可以保證COne
是標准布局類(9p7),但通常會阻止多態)。
編譯器需要COne
完整才能執行轉換(3.2p5),因為COne
可以使用虛擬或多重繼承,並且通常因為不需要多態類具有簡單的內存布局。
struct COne: BaseZero, BaseOne { ... };
struct COne: virtual BaseOne { ... };
您將不得不將強制轉換移動到COne
的源文件中的某個點,或者編寫自己的強制轉換函數BaseOne *to_base(COne *)
,並在源文件中的某個點處實現COne
的定義可用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.