2012-01-09 5 views
2
class tabBase 
{ 

public: 
    tabBase() { } 
    virtual ~tabBase() { } 

    virtual void write() {} 
    virtual void read() {} 
    virtual void start() {} 
    virtual void stop() {} 
    virtual void connect() {} 
    virtual void disconnect() {} 
    virtual void openFile() {} 
    virtual void closeFile() {} 
    virtual void searchForText() {} 

}; 

class tcpServerTab : public tabBase 
{ 

public: 
    tcpServerTab() { /* ...code... */ } 
    virtual ~tcpServerTab() { /* ...code... */ } 

    virtual void write() { /* ...code... */ } 
    virtual void read() { /* ...code... */ } 
    virtual void start() { /* ...code... */ } 
    virtual void stop() { /* ...code... */ } 

}; 

class tcpClientTab : public tabBase 
{ 

public: 
    tcpClientTab() { /* ...code... */ } 
    virtual ~tcpClientTab() { /* ...code... */ } 

    virtual void write() { /* ...code... */ } 
    virtual void read() { /* ...code... */ } 
    virtual void start() { /* ...code... */ } 
    virtual void stop() { /* ...code... */ } 

    virtual void connect() { /* ...code... */ } 
    virtual void disconnect() { /* ...code... */ } 

}; 

class plainTextTab : public tabBase 
{ 

public: 
    plainTextTab() { /* ...code... */ } 
    virtual ~plainTextTab() { /* ...code... */ } 

    virtual void openFile() { /* ...code... */ } 
    virtual void closeFile() { /* ...code... */ } 
    virtual void searchForText() { /* ...code... */ } 

}; 

上記の例のように、基本クラスの派生クラスで使用できるすべての関数を配置すると、設計上の問題や予期しない結果が生じることはありますか?基本クラスの任意の派生クラスで使用される関数を配置しますか?

+0

です。これらのクラスを多態的に使うつもりですか? –

+0

はい私も欲しいです。 – TheFuzz

答えて

2

あなたがそれらの機能の全てすべて派生クラスで実装されることを(力を)確認したい場合は、あなたがそれらを純粋仮想作る必要があります。そうでなければ、あらかじめ決めておいて、すべて関数を空のボディにするだけでは意味がありません。あなたの例で判断すると、複数のレベルの継承が必要と思われます。

+0

代替デザインとは何ですか?また、余分な継承レベルはどのように見えますか? – TheFuzz

+0

基本クラスに*すべての*関数を持つ必要はありません。関数が単一の派生クラスにのみ関連している場合は、基本クラスでそれを持つ必要は全くありません。 searchForTextはこれの例です。 tcpServerTabとtcpClientTabは、networkTabから派生させることができます(それ自体はtabBaseから派生しています)。 –

関連する問題