簡體   English   中英

運行時綁定和模板實例化

[英]Runtime binding and template instantiation

這里可以看到,並非所有模板函數都在模板類中編譯。 Standard表示,如果未使用該方法或成員,則不會對其進行編譯。 確實很酷的功能! 現在,讓我們討論以下層次結構:

class A
{
  virtual void f() {};
};

template <typename T>
class B : public A
{
  virtual void f () override
  {
       // do something dangerous
  }
}

您將永遠不會知道是否正在調用B<int>::f ,對嗎? 原因是您可以調用具有動態綁定的函數B::f ,並且永遠不知道A*指向B類型對象還是派生自A其他類型對象。 那么編譯器應如何處理這種情況?

A* ptr = nullptr;
if (i > 0)
{
    ptr = new B<int>();
}
ptr->f();

編譯器如何猜測/發現這種情況以生成B<int>::f

重要相關問題: C ++類成員函數模板可以是虛擬的嗎?

您必須在程序中的某個位置使用B<int>或從其派生的類型來創建實例。 那時,模板被實例化並為其生成代碼。 也有顯式實例化。 查閱cppreference.com了解詳細信息。

暫無
暫無

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

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