多重繼承中,若兩個基類別共同繼承自同一個基類別,最底層派生類別會包含兩份頂層基類別子物件,導致資料重複與存取模糊。
在中間層基類別繼承頂層基類別時加上 virtual 關鍵字(virtual public Base),確保最底層派生類別只保留一份頂層基類別子物件。
/* cppprimer.cpp
* Created on: 2014.1.10
* Author: Spike
*/
#include <iostream>
#include <string>
class ZooAnimal {
public:
void zooprint() { cout << "Zoo Animal!" << endl; }
};
class Raccoon : public virtual ZooAnimal {
public:
void raccprint() { cout << "Raccoon!" << endl; }
};
class Bear : public virtual ZooAnimal {
public:
void bearprint() { cout << "Bear!" << endl; }
};
class Panda : public Bear, public Raccoon {
public:
void pandprint() { cout << "Panda!" << endl; }
};
void dance(Bear& B) { B.bearprint(); }
void rummage(Raccoon& R) { R.raccprint(); }
int main() {
Panda P;
P.zooprint(); // 呼叫唯一的 ZooAnimal::zooprint
dance(P);
rummage(P);
}
Zoo Animal!
Bear!
Raccoon!
sizeof(IOFile) == 2 * sizeof(File)(兩份基類別)。sizeof(vIOFile) == sizeof(File) + 2 * sizeof(vptr)(一份基類別 + 虛擬基類別指標)。