簡體   English   中英

抽象基類中私有虛函數的可見性

[英]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.

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