日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言中d1的分辨率是,C中的方法分辨率顺序

發布時間:2023/12/9 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言中d1的分辨率是,C中的方法分辨率顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C中沒有像MRO那樣的MRO.如果一個方法是模糊的,那么這是一個編譯時錯誤.一個方法是否是虛擬的不影響它,但虛擬繼承會.

該算法在C標準§[class.member.lookup](10.2)中描述.基本上它將在超類圖中找到最接近的明確的實現.該算法的工作原理如下:

假設你想在C類中查找一個函數f.

>我們定義一個查找集合S(f,C),它是一組表示所有可能性的集合(Δ,Σ). (§10.2/ 3)

>集合Δ稱為聲明集,這基本上都是可能的f.

>集合Σ被稱為子對象集,它包含找到這些f的類.

>讓S(f,C)包括C中直接定義(或使用ed)的所有f(如果有的話)(§10.2/ 4):

Δ = {f in C};

if (Δ != empty)

Σ = {C};

else

Σ = empty;

S(f, C) = (Δ, Σ);

>如果S(f,C)為空(§10.2/ 5),

>計算S(f,Bi)其中Bi是C的基類,對于所有i.

將每個S(f,Bi)逐個合并成S(f,C).

if (S(f, C) == (empty, empty)) {

B = base classes of C;

for (Bi in B)

S(f, C) = S(f, C) .Merge. S(f, Bi);

}

>最后,聲明集作為名稱解析的結果返回(§10.2/ 7).

return S(f, C).Δ;

>兩個查找集合(Δ1,Σ1)和(Δ2,Σ2)之間的合并定義為(§10.2/ 6):

>如果Σ1中的每個類都是Σ2中至少一個類的基類,則返回(Δ2,Σ2).

(反之亦然)

>否則如果Δ1≠Δ2,則返回(模糊,Σ1∪Σ2).

>否則返回(Δ1,Σ1∪Σ2)

function Merge ( (Δ1, Σ1), (Δ2, Σ2) ) {

function IsBaseOf(Σp, Σq) {

for (B1 in Σp) {

if (not any(B1 is base of C for (C in Σq)))

return false;

}

return true;

}

if (Σ1 .IsBaseOf. Σ2) return (Δ2, Σ2);

else if (Σ2 .IsBaseOf. Σ1) return (Δ1, Σ1);

else {

Σ = Σ1 union Σ2;

if (Δ1 != Δ2)

Δ = ambiguous;

else

Δ = Δ1;

return (Δ, Σ);

}

}

例如(§10.2/ 10),

struct V { int f(); };

struct W { int g(); };

struct B : W, virtual V { int f(); int g(); };

struct C : W, virtual V { };

struct D : B, C {

void glorp () {

f();

g();

}

};

我們計算

S(f, D) = S(f, B from D) .Merge. S(f, C from D)

= ({B::f}, {B from D}) .Merge. S(f, W from C from D) .Merge. S(f, V)

= ({B::f}, {B from D}) .Merge. empty .Merge. ({V::f}, {V})

= ({B::f}, {B from D}) // fine, V is a base class of B.

S(g, D) = S(g, B from D) .Merge. S(g, C from D)

= ({B::g}, {B from D}) .Merge. S(g, W from C from D) .Merge. S(g, V)

= ({B::g}, {B from D}) .Merge. ({W::g}, {W from C from D}) .Merge. empty

= (ambiguous, {B from D, W from C from D}) // the W from C is unrelated to B.

總結

以上是生活随笔為你收集整理的c语言中d1的分辨率是,C中的方法分辨率顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。