[英]Why does base class pointer to a derived class object with overridden method call a base class method?
[英]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.