簡體   English   中英

調用虛擬方法而不指向對象?

[英]calling virtual method without pointing to an object?

#include <iostream>

struct A {
    void init()
    {
        internal_init();
    }
    virtual void internal_init()
    {
        std::cout << "internal of A" << std::endl;
    }
};

struct B: public A {
    void internal_init()
    {
        init();
        std::cout << "internal of B" << std::endl;
    }
};

int main(){
    B instance;
    std::cout << "internal of A" << std::endl;
    instance.internal_init();
    return 0;
}

首先,程序按預期轉到B::internal_init() 然后,到A::init() (我猜是因為B派生自A,並且B沒有任何init() )。 怎么辦?

它會選擇哪種internal_init() 因為它轉到B::internal_init() ,所以程序將進入無限循環,我不明白為什么。

  • 當我調用internal_init()時,真正發生了什么?
  • 為什么調用實例的“ B部分”的internal_init() 這是關於“虛擬”的嗎? 如果是這樣,怎么會呢? 當我們使用多態性時,虛擬函數就會發生(據我自己的初學者所知,它與指向派生類對象的基類的指針一起工作)。

由於instance是一個B

instance.internal_init();

將調用Binternal_init() 然后在internal_init()調用init(); 現在,成員函數有一個隱式參數,它是this指針。

因此,當我們調用Ainit() ,此指針實際上是B init()我們調用internal_init(); 使用this指針指向B 由於internal_init()是虛擬的,並且我們有一個指向B的指針,因此虛擬查找機制將調用Binternal_init()

然后,這再次循環,最終將導致段錯誤或堆棧溢出。

首先,由於struct B: public A struct B繼承了struct A所有功能。 功能internal_initA在被覆蓋B ,因為你使用相同的函數簽名和關鍵字virtualA

所以現在的調用是: instance.internal_init(); 它調用B internal_init() ,然后調用A::init ,然后調用B::internal_init()等,直到給出分段錯誤為止。 為了防止這種情況(我想這就是您想要的),可以在B顯式調用Ainternal_init() ,而不是調用init()

struct B: public A {
    virtual void internal_init()
    {
        A::internal_init();
        std::cout << "internal of B" << std::endl;
    }
};

暫無
暫無

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

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