Saya mendapat pertanyaan ini ketika saya menerima komentar ulasan kode yang mengatakan fungsi virtual tidak perlu sebaris.
Saya pikir fungsi virtual sebaris bisa berguna dalam skenario di mana fungsi dipanggil pada objek secara langsung. Namun argumen yang muncul di benak saya adalah - mengapa seseorang ingin mendefinisikan virtual dan kemudian menggunakan objek untuk memanggil metode?
Apakah lebih baik tidak menggunakan fungsi virtual sebaris, karena mereka hampir tidak pernah diperluas?
Cuplikan kode yang saya gunakan untuk analisis:
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()
bisa diselesaikan sebagai panggilan non-virtual, itu mungkin ada sebaris panggilan itu. Panggilan yang direferensikan ini diuraikan oleh g ++ 3.4.2: TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction();
Kode Anda tidak.