[英]Derived class Private method is getting called
我有一個指向派生類對象的基類指針。 方法foo()在基類中是公共的,但在派生類中是私有的。 基類foo()是虛擬的。 因此,當我從基類指針調用foo()時,Vptr Table具有派生類foo()的地址,但它在派生類中是私有的...那么它怎么被調用。
我了解運行時多態性,也了解訪問說明符在編譯時有效,而虛擬概念在運行時有效。 因此,不會有編譯器錯誤。
我的問題是:這是一個循環孔,通過它我們可以調用Derived類的私有方法? 或預期會以這種方式表現。 此行為的任何好的解釋。
非常感謝。
代碼:
class A
{
public:
virtual void foo()
{
std::cout << "In A";
}
};
class B:public A
{
private:
void foo()
{
std::cout << "In B ??? Its Private Method :-( ";
}
};
int main()
{
A* ptr = new B();
ptr->foo();
return 0;
}
它是私有方法,但由於它是虛擬的,因此可以調用。
n3690 11.5 / 1
虛擬函數的訪問規則(第11條) 由其聲明確定,並且不受后來覆蓋該函數的函數規則的影響。
為什么這個? 以來
n3690 11.5 / 2
在調用點使用用於表示為其調用成員函數的對象的表達式的類型(在上例中為B *)檢查訪問。 通常不知道在定義成員函數的類中訪問成員函數的情況(上述示例中的D)。
訪問級別是一個編譯時概念。 運行時不知道方法是被聲明為private
還是public
。 這些是為了您的方便。
這實際上是一個很好的編碼標准- virtual
方法最好在基類中是public
,而在private
類中應該是private
或protected
。 這將迫使調用者使用接口,而不是實際的類型(當然,這並不總是實用的,但要考慮到這是一件好事)。
具體類型應按您的情況抽象出來。 base方法被聲明為public
並且您是通過指向base的指針來調用它的,因此允許它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.