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中的方法分辨率顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【认知femto】femtocell的认
- 下一篇: [css] 怎么实现移动端的边框0.5