簡體   English   中英

在c ++中沒有虛函數的多重繼承

[英]Multiple inheritance without virtual functions in c++

我遇到了鑽石問題,並為一個鑽石找到了不同案例的不同解決方案。 但是,我無法找到“鏈式”鑽石的解決方案。

根據結構:是的,我希望每次都有多個基類,因此虛擬繼承不是解決方案(它甚至稱為菱形?)。 我還想避免鑽石每個中間層的get / set-functions。

p   p
|   |
k   k
 \ /
  s

class parent { int val; };
class kid1 : public parent {};
class kid2 : public parent {};
class school : public kid1, public kid2 {};

在父類中訪問val現在可以如下工作:

school* s = new school;
s->kid1::val=1; // works

但是下一個“鏈式”鑽石呢:

p   p   p   p
|   |   |   |
k   k   k   k
 \ /     \ /
  s       s
  |       |
  c       c
    \   /
      w

class country1 : public school {};
class country2 : public school {};
class world : public country1, public country2 {};

訪問val via:

world* w = new world;
w->country1::kid1::val=1; // error

結果是:

error: ‘kid1’ is an ambiguous base of ‘world’

為什么? 是不是很好地定義了價值的路線?

s->kid1::val並不意味着“來自kid1子對象的val ”。 它只是一個由包含它的類型(不是子對象)限定的名稱。

我不知道為什么country1::kid1甚至被接受,但顯然它是::kid1的typedef。 world兩個數據成員都具有限定名稱::kid1::val

你想要的是:

world* w = new world;
country1* const c1 = world;
c1->kid1::val = 1;

它是。 該錯誤是由於編譯器中的錯誤引起的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM