Tôi nhận được câu hỏi này khi nhận được một nhận xét đánh giá mã nói rằng các hàm ảo không cần phải là nội tuyến.
Tôi nghĩ rằng các hàm ảo nội tuyến có thể có ích trong các tình huống trong đó các hàm được gọi trực tiếp trên các đối tượng. Nhưng đối số xuất hiện trong đầu tôi là - tại sao người ta lại muốn định nghĩa ảo và sau đó sử dụng các đối tượng để gọi các phương thức?
Có phải tốt nhất là không sử dụng các chức năng ảo nội tuyến, vì dù sao chúng gần như không bao giờ được mở rộng?
Đoạn mã tôi đã sử dụng để phân tích:
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()
có thể được giải quyết dưới dạng cuộc gọi không ảo, thì nó có thể có cuộc gọi nội tuyến đó. Cuộc gọi được tham chiếu này được nội tuyến bởi g ++ 3.4.2: TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
Mã của bạn thì không.