[英]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.