簡體   English   中英

C ++,抽象類和繼承

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

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