簡體   English   中英

派生類Private方法被調用

[英]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類中應該是privateprotected 這將迫使調用者使用接口,而不是實際的類型(當然,這並不總是實用的,但要考慮到這是一件好事)。

具體類型應按您的情況抽象出來。 base方法被聲明為public並且您是通過指向base的指針來調用它的,因此允許它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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