[英]Visibility of private virtual function in abstract base classes
考慮以下代碼:
class A {
public:
virtual void f() const = 0;
void callf() const { f(); }
};
class B : public A {
virtual void f() const { }
};
int main()
{
B x;
x.callf();
return 0;
}
類B
派生自抽象基類A
,但“隱藏”了已實現的方法f()
作為私有成員。 盡管如此,繼承的成員callf()
能夠調用f()
,它在基類中是公共的。 代碼在 g++ 10.1.0 和 clang++ 11.1.0 上編譯時沒有警告。
這是一個合法的代碼,即繼承的callf()
是否正確地看到了私有成員f()
?
或者,派生類B
是否有可能實現基類的純虛方法,以便它們只能由B
(和朋友)調用?
這是一個合法的代碼,即繼承的 callf() 是否正確地看到了私有成員 f()?
是的,這是合法的代碼。 從編譯器的角度來看, callf
函數引用了它自己類的f
函數; 這是一個虛函數這一事實不影響范圍(或可訪問性)——僅影響實現,它將以調用 v-table 條目的形式出現。 當通過派生類調用時,該 v-table 條目將在運行時被正確解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.