簡體   English   中英

虛函數在構造函數中的奇怪行為

[英]Strange behavior of virtual functions in constructor

我已經搜索了有關構造函數中的虛函數的相關問題,並且我知道,如果我們在基類中的構造函數中調用虛函數,則僅會調用virtual的基礎版本。

但是,我在下面發布的內容表明在Base構造函數中對virtual的調用實際上在D2中調用了虛擬版本。

我知道它似乎有些重復,但我想知道是否有人幫助我。

我的代碼:

#include<iostream>
struct B
{
  B()=default;
  B(const B& b)  {b.fun();}
  virtual void fun()const  {std::cout<<"virtual_B"<<std::endl;}
};
struct D1:public B
{
  D1()=default;
  D1(const D1& d1):B(d1)  {}
  void fun()const  {std::cout<<"virtual_D1"<<std::endl;}
};
struct D2:public D1
{
  D2()=default;
  D2(const D2& d2):D1(d2)  {}
  void fun()const  {std::cout<<"virtual_D2"<<std::endl;}
};
int main()
{
  D2 a;
  D2 b=a;
  return 0;
}

因為您調用b.fun() ,所以b是現有的完全構造的對象。 如果在尚未完全構造的對象this指針上調用虛擬方法,則虛擬方法將無法以虛擬方式工作。 如果在構造函數上調用其他對象的虛擬方法,它們將完全按預期工作。

我知道,如果我們在基類的構造函數中調用虛擬函數,則僅會調用虛擬的基本版本。

您誤解了該規則。

這並不意味着從構造函數內部調用虛擬函數的任何方式。 這意味着為正在構造的對象調用虛函數。

在構造函數中,您為另一個(完全構建的)對象調用了虛擬函數,該對象的編譯時間類為B,運行時類為D2。 在該對象上,您將獲得虛擬功能的D2版本。

暫無
暫無

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

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