[英]C++, abstract class and inheritance
我正在嘗試兩個兩個地處理類實例。 我有一個包含doStuff方法的抽象基類(此處為IBase)。 該方法將在擴展類中被覆蓋,以便處理所有其他定義的類。
這是我正在建立的圖書館的一部分。 我希望基礎對象由庫用戶編寫。 每個Base類都需要通過doStuff方法與另一個Base對象進行交互。 需要容器來處理多個基礎對象。
這不是我第一次遇到這個問題,但是我不記得上次是怎么做的。 這種類可以用於很多事情。 在這里,它是一個碰撞檢測系統。 IBase表示抽象的HitBox,而Container表示發生碰撞的場景。 在這種情況下,Container :: process檢查命中框之間的轉換,而Container :: process用於實現優化算法(四叉樹,...)。
我以這種方式構建了這些類:
class IBase {
public:
virtual void doStuff(IBase* base) = 0;
}
class Base {
public:
virtual void doStuff(Base* base) {
foobar();
}
virtual void doStuff(IBase* base) {
// irrelevant
}
}
class Container {
public:
void process() {
for (std::list<IBase*>::iterator it=base_list.begin() ; it!=base_list.end() ; it++) {
for (std::list<IBase*>::itarator jt=std::next(it) ; jt!=base_list.end() ; jt++) {
(*it)->doStuff(*jt);
}
}
}
private:
std::list<Ibase*> base_list;
}
但是在循環中,使用兩個Base對象時,我無法達到無效的Base :: doStuff(Base *)。 我只能調用Base :: doStuff(IBase *),這不是我想要的。
有什么幫助嗎? 我了解問題所在,但看不到解決方案。 這是處理它的好方法還是我需要重新考慮我的體系結構? 你會怎么做? 我認為必須存在針對此類問題的設計模式,但是我沒有找到合適的設計模式。
謝謝
C ++不支持參數自變量。 另請參見為什么沒有用於覆蓋的參數反方差? 。
您最好從doStuff(IBase* base)
主體中顯式調用doStuff(Base* base)
。
從*it
和*jt
取消引用的對象是IBase
對象,而不是Base對象。 這意味着只能調用IBase
中的方法。
您的虛擬方法:
virtual void doStuff(Base* base) { ... }
沒有覆蓋任何東西。 它正在創建只能從Base向下訪問的新虛擬方法。 當您從IBase
指針調用doStuff
,它將調用:
virtual void doStuff(IBase* base) { ... }
與IBase
定義的簽名匹配。
如果要執行你的foobar
功能,你應該做一些對檢查的base
時,它是基於到覆蓋doStuff
,將其轉換為Base*
一旦你確定它是安全的,然后根據需要使用它。
virtual void doStuff(IBase* base) {
// not irrelevant
if (base->isBase())
{
foobar();
}
}
最后,如先前所建議,將doStuff
公開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.