[英]Calling std::function object pointing to the method of deallocated object
[英]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()
時,真正發生了什么? internal_init()
? 這是關於“虛擬”的嗎? 如果是這樣,怎么會呢? 當我們使用多態性時,虛擬函數就會發生(據我自己的初學者所知,它與指向派生類對象的基類的指針一起工作)。 由於instance
是一個B
instance.internal_init();
將調用B
的internal_init()
。 然后在internal_init()
調用init();
。 現在,成員函數有一個隱式參數,它是this指針。
因此,當我們調用A
的init()
,此指針實際上是B
在init()
我們調用internal_init();
使用this指針指向B
由於internal_init()
是虛擬的,並且我們有一個指向B
的指針,因此虛擬查找機制將調用B
的internal_init()
。
然后,這再次循環,最終將導致段錯誤或堆棧溢出。
首先,由於struct B: public A
struct B
繼承了struct A
所有功能。 功能internal_init
的A
在被覆蓋B
,因為你使用相同的函數簽名和關鍵字virtual
的A
。
所以現在的調用是: instance.internal_init();
它調用B
internal_init()
,然后調用A::init
,然后調用B::internal_init()
等,直到給出分段錯誤為止。 為了防止這種情況(我想這就是您想要的),可以在B
顯式調用A
的internal_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.