2012-01-09 23 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

這要看。你打算以多態的方式使用這些類嗎? – 2012-01-09 00:38:06

+0

是的,我也想。 – TheFuzz 2012-01-09 01:03:49

回答

2

如果你想確保(力)所有這些功能將在所有派生類中實現的,你應該讓他們虛。否則試圖預先確定並列出所有可能的帶空體的功能只是沒有多大意義。從你的例子來看,你似乎需要不止一個級別的繼承。

+0

什麼是替代設計?另外,額外的繼承級別會是什麼樣子? – TheFuzz 2012-01-09 00:59:52

+0

沒有必要在基類中有*全部*你的函數。如果該函數僅與單個派生類相關,則根本不需要將其放在基類中。 searchForText可以是這方面的例子。 tcpServerTab和tcpClientTab可以從networkTab派生(它本身是從tabBase派生的)。 – 2012-01-09 01:07:45

相關問題