菱形繼承與虛擬繼承

2021-07-26 23:42:36 字數 1068 閱讀 5820

c++中的繼承有單繼承和多繼承;本文主要探索的是多繼承中菱形繼承的二義性和資料冗餘及解決方案;

菱形繼承的物件模型:

從記憶體看菱形繼承物件模型:

用乙個簡易 的**來說明二義性和資料冗餘這個問題:

class aa;

class bb : public aa;

class cc : public aa;

class dd : public bb, public cc;

void test()

建立dd物件:

dd s;

s._aa = 1;訪問_aa時會出現對_aa訪問不明確的錯誤,可能是bb中的_aa,也可能是cc中的_aa;這就是二義性的問題;

可以指定所屬類域來解決二義性問題,s.bb::_aa = 1; s.cc::_aa = 0; 但是這個並沒有解決資料冗餘的問題;

這就需要用到虛繼承來解決二義性和資料冗餘的問題;

class aa;

class bb :virtual public aa;

class cc :virtual public aa;

class dd : public bb, public cc;

void test()

從記憶體看菱形虛擬繼承物件模型:

由上圖可以看出bb和cc中的_aa是同乙個物件,解決了二義性和資料冗餘的問題;

菱形繼承 菱形虛擬繼承

菱形繼承 鑽石繼承 模型 拿如下 舉例 class person class student public person class teacher public person class graduate public student,public teacher void test 當派生類gr...

繼承 多繼承 菱形虛擬繼承

繼承 繼承是由父類和子類 或稱之為基類與派生類 兩種角色構成,子承父業,就是說派生類會繼承基類的所有的成員,並擁有自己特有的成員。用一段 來解釋說明繼承關係 include using namespace std class base 基類 class derived public base 以共有...

菱形虛擬繼承

菱形繼承在c 繼承中是一種複雜的繼承關係,存在著二義性和資料冗餘的問題,而菱形虛擬繼承則是為了解決菱形繼承所存在的問題。為了 菱形虛擬繼承如何解決該問題,我先建立個乙個較為簡單的菱形繼承模型。下面分別是菱形繼承和菱形虛擬繼承的 實現 菱形繼承 include includeusing namespa...