兩個基類別共同繼承同一頂層基類別,最底層派生類別會包含兩份頂層基類別子物件,造成資料重複與存取模糊。
中間層以 virtual public Base 繼承,確保最底層派生類別僅有一份頂層基類別。
/* test.cpp
* Created on: 2014.04.14
* Author: Spike
*/
#include <iostream>
#include <string>
using namespace std;
class File { private: int i[10]; };
class InputFile : public File {};
class OutputFile : public File {};
class IOFile : public InputFile, public OutputFile {};
class vInputFile : virtual public File {};
class vOutputFile : virtual public File {};
class vIOFile : public vInputFile, public vOutputFile {};
int main() {
cout << "File = " << sizeof(File) << endl; // 40
cout << "InputFile = " << sizeof(InputFile) << endl; // 40
cout << "OutputFile = " << sizeof(OutputFile) << endl; // 40
cout << "IOFile = " << sizeof(IOFile) << endl; // 80 (兩份 File)
cout << "virtual InputFile = " << sizeof(vInputFile) << endl; // 44 (File + vptr)
cout << "virtual OutputFile = " << sizeof(vOutputFile) << endl; // 44
cout << "virtual IOFile = " << sizeof(vIOFile) << endl; // 48 (一份 File + 2 vptr)
}
File = 40
InputFile = 40
OutputFile = 40
IOFile = 80
virtual InputFile = 44
virtual OutputFile = 44
virtual IOFile = 48
IOFile 含兩個 File 子物件(80 bytes)。vIOFile 含一個 File 子物件 + 兩個虛擬基類別指標(48 bytes)。