簡體   English   中英

抽象基礎 class 指針可以調用未被覆蓋的派生 class 的函數嗎?

[英]Can an abstract base class pointer call the functions of a derived class that are not overridden?

我正在嘗試使用抽象基 class 指針來調用未被覆蓋的派生 class function,但我無法調用它。 我們可以通過指向派生 class object 的基類 class 指針調用重寫的 function,那么為什么我們不能通過基類 class 指針調用派生類 class 的其他成員函數呢?

當在 object 上調用方法時,編譯器生成機器碼以兩種不同方式之一調用該方法:

  • 如果該方法不是virtual ,則直接調用指針鍵入的相同 class 的方法。 此跳轉是在編譯時靜態計算的。 不考慮派生 class 的任何可能性。
  • 如果該方法是virtual ,則調用該方法的最派生覆蓋版本。 這種跳轉是通過運行時的動態調度來解決的,通常(但不是必需的)通過使用虛擬方法表(vtables)來解決,該表包含指向對象 class 層次結構的每個 class 中最常被覆蓋的方法的指針。

動態調度中只有virtual方法是顆粒狀的。 僅當該方法在基 class 中是virtual的並且在派生的 class 中被覆蓋時,派生的 class 方法才可通過基 class 指針調用。

否則,將直接調用基本 class 方法。 在這種情況下,調用派生 class 方法的唯一方法是將基 class 指針向下轉換為正確的派生 class 類型,然后通過結果指針調用該方法。

例如:

class Base
{
public:
    virtual ~Base() { }
    void nonVirtualMethod() { }
    virtual void virtualMethod() { }
};

class Derived : public Base
{
public:
    void nonVirtualMethod() { }
    void virtualMethod() override { }
};

int main()
{
    Derived d;
    Base *b = &d;
    b->nonVirtualMethod(); // calls Base::nonVirtualMethod()
    static_cast<Derived*>(b)->nonVirtualMethod(); // calls Derived::nonVirtualMethod()
    b->virtualMethod(); // calls Derived::virtualMethod()
}

暫無
暫無

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

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