2014-02-16 35 views
4

根據我所讀到的,當你有一個抽象基類持有數據時,將使用虛擬基類,因此該類不會被複制,但是,如果不使用虛擬類,複製類時會出現什麼問題?爲什麼我應該使用虛擬基類?

應該避免保存數據的抽象基類嗎?

如下的例子:

class Storable { 
public: 
    Storable(const string& s); 
    virtual void read() = 0; 
    virtual void write() = 0; 
    virtual ~Storable(); 
protected: 
    string file_name; // store in file named s 
    Storable(const Storable&) = delete; 
    Storable& operator=(const Storable&) = delete; 
}; 

class Transmitter : public virtual Storable { 
public: 
    void write() override; 
    // ... 
}; 

class Receiver : public virtual Storable { 
public: 
    void write() override; 
// ... 
}; 

class Radio : public Transmitter, public Receiver { 
public: 
    void write() override; 
    // ... 
}; 

這個例子是從書上所採取的C + +編程語言 第4版 - Bjarne的Stroustrup的。

+0

當我寫了重複類,它不是在這個意義上,我不會重複的代碼。 – Alex

+2

問題是您可能希望數據對於兩個實例都是相同的,這很難維護 – StoryTeller

+1

查看鑽石繼承,例如, [這裏](http://stackoverflow.com/questions/379053/diamond-inheritance-c)。 –

回答

5

要儘量簡短,如果你不會從TransmitterReceiver使用虛擬繼承了Storable然後Radio將繼承它兩次,一次一次。

這意味着Radio需要內存的Storable這兩個實例,這是一些內存開銷,你最希望兩個都有相同的數據反正(如果你不繼承它,事實上你必須手動管理)。
此外,當您從Storable(或訪問數據成員)調用基類函數時,您想調用哪一個函數?從Storable的一個打通Transmitter繼承或從Storable是打通Receiver

虛繼承繼承了一個需要照顧,與僅具有都繼承類共享Storable基類的一個實例。

有關虛基類更多資料,有一個很好的問題在這裏:In C++, what is a virtual base class?

+0

那麼,每次我使用抽象基類時,我應該使用虛擬繼承? – Alex

+1

@Alex只有在繼承兩次時纔會出現問題,如繼承自'T2'和'T3'的'T1'和'T4'的'T2'和'T3'。 –

+1

如果你只能繼承一個'T1'的實例,那麼就不需要虛擬基類。 –

2

虛基類是在虛擬繼承使用,是防止多個「實例」出現在繼承層次給定類的一種方式當使用多個繼承,即只是爲了避免DIAMOND PROBLEM。爲了避免這個鑽石問題,我們要麼使用虛擬基類,要麼使用'::'即範圍解析運算符來清楚地理解我們想要使用的類的方法或數據。 請參考Diamond Problem

相關問題