2012-08-08 78 views
0

成員是否有可能有一個具有派生類的實例作爲參數的基類的功能中的一個基類?例如:C++繼承的基類派生使用類

class A 
{ 
    virtual void foo(B b[]); 
}; 
Class B: public A 
{ 
    void foo(B b[]); 
}; 

這合法嗎?此外,類A需要包含類B的頭文件,這是否也有問題?

回答

7

有可能與前向聲明:

class B; 
class A 
{ 
    virtual void foo(B b[]); 
}; 
Class B: public A 
{ 
    void foo(B b[]); 
}; 

這是一個重大的代碼味道。請說明你想達到的目標,這看起來像一個錯誤的設計。

+3

+1 **這是一個主要的代碼氣味** – 2012-08-08 22:39:24

2

你可以使用奇異遞歸模板模式:

template <class T> 
class A 
{ 
public: 
    virtual void foo(T t[]); 
}; 

class B: public A<B> 
{ 
public: 
    void foo(B b[]); 
}; 
0

一種方法,定義可以定義要在派生類中揭露功能的接口類。如果你想在基類的成員函數中訪問派生類B內部,那麼這種方法並不比已發佈的方法更好。

class IntfB 
{ 
    public: 
    virtual void meth1() = 0; 
    virtual void meth2() = 0; 
}; 

class A 
{ 
    public: 
    virtual void foo(IntfB b[]); 
}; 

class B : public A, public IntfB 
{ 
    public: 
    virtual void meth1(); 
    virtual void meth2(); 
};