ฉันได้รับคำถามนี้เมื่อฉันได้รับรหัสตรวจสอบความคิดเห็นว่าฟังก์ชั่นเสมือนไม่จำเป็นต้องอยู่ในบรรทัด
ฉันคิดว่าฟังก์ชั่นเสมือนแบบอินไลน์อาจมีประโยชน์ในสถานการณ์ที่เรียกใช้ฟังก์ชันบนวัตถุโดยตรง แต่ข้อโต้แย้งโต้เถียงกันในใจของฉันก็คือ - ทำไมคนเราถึงต้องการกำหนดเสมือนและใช้วัตถุเพื่อเรียกวิธีการ
เป็นการดีที่สุดที่จะไม่ใช้ฟังก์ชั่นเสมือนแบบอินไลน์เนื่องจากพวกมันแทบไม่เคยขยายเลย
ข้อมูลโค้ดที่ฉันใช้สำหรับการวิเคราะห์:
class Temp
{
public:
virtual ~Temp()
{
}
virtual void myVirtualFunction() const
{
cout<<"Temp::myVirtualFunction"<<endl;
}
};
class TempDerived : public Temp
{
public:
void myVirtualFunction() const
{
cout<<"TempDerived::myVirtualFunction"<<endl;
}
};
int main(void)
{
TempDerived aDerivedObj;
//Compiler thinks it's safe to expand the virtual functions
aDerivedObj.myVirtualFunction();
//type of object Temp points to is always known;
//does compiler still expand virtual functions?
//I doubt compiler would be this much intelligent!
Temp* pTemp = &aDerivedObj;
pTemp->myVirtualFunction();
return 0;
}
pTemp->myVirtualFunction()
สามารถแก้ไขเป็นการโทรที่ไม่ใช่เสมือนได้อาจมีการโทรในบรรทัดนั้น การอ้างอิงที่อ้างอิงนี้มีการขีดเส้นใต้โดย g ++ 3.4.2: TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
รหัสของคุณไม่ใช่