簡體   English   中英

如何在C ++中最好地對不完整類型使用多態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM