我有一些類描述能力/行爲,如飛行或駕駛等。每個類都有一個特定的方法,必須調用來加載一些數據 - 例如,Flyable有loadFlyData()
,Drivable有loadDriveData()
。對於每個類,方法名稱都是唯一的。如何從基類派生的子類自動調用方法或生成代碼?
我有許多派生類可能從一個或多個這些行爲類繼承。每個派生類都有一個名爲loadData()
的方法,其中我們應該調用所有的父行爲類方法,如loadFlyData()
,loadDriveData()
等....有沒有一種方法可以使用元編程自動生成此方法?由於有許多派生類,如果我可以使用元編程生成這些方法,它可能更易於維護...
行爲類:(一個對象類可能有這些行爲中的任何一種,並且必須調用那些類「load 「方法...
class Flyable {
void loadFlyData() {
}
};
class Drivable{
void loadDriveData() {
}
};
所有對象類從對象導出:
class Object {
virtual void loadData() {
}
};
派生類:
class FlyingCar : public Object, public Flyable, public Drivable {
virtual void loadData() override {
// How to automatically generate code so that the next two lines are called:
loadFlyData();
loadDriveData();
}
};
可以'loadFlyData()'和'loadDriveData'是同一個名字的?這樣它們只能通過範圍來區分,「Flyable :: loadData()'和'Drivable :: loadData()'?如果是這樣,那麼基於模板的方法來調用每個T :: loadData(),其中T是一個基類,應該可以工作。雖然不確定如何以可變參數的形式獲取基類列表。 – themagicalyang
如果所有的基礎對象對「加載」函數使用相同的名稱(例如'loadData'),那麼可以創建一個預處理步驟來獲取源文件並對其進行修改。使用模板元編程可能是可能的,但它可能比它的價值更多的工作(並且你現在的解決方案將更少寫,更重要的是更易於閱讀和維護)。在運行時也可以創建代碼,但這會更困難,並且會使其不易讀和維護。你現在擁有的只是最好和最簡單的解決方案。 –
是的,我們可以爲loadFlyData和loadDriveData命名。對我來說(來自java背景)的困惑是如果他們有相同的名稱(這就是爲什麼我使用不同的名稱)如何處理衝突。下面給出的答案是我尋找的東西(由講故事者和krzaq)。我不知道你可以在C++中做這些事情! –