首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 虛擬繼承詳解:菱形繼承與記憶體配置

     編輯:關於C++

菱形繼承問題

兩個基類別共同繼承同一頂層基類別,最底層派生類別會包含兩份頂層基類別子物件,造成資料重複與存取模糊。

虛擬繼承解決

中間層以 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)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved