如何識別vptr是否將用於調用虛函數?編譯器如何決定何時使用vPtr調用函數
考慮下面的層次結構:
class A
{
int n;
public:
virtual void funcA()
{std::cout <<"A::funcA()" << std::endl;}
};
class B: public A
{
public:
virtual void funcB()
{std::cout <<"B::funcB()" << std::endl;}
};
A* obj = new B();
obj->funcB(); //1. this does not even compile
typedef void (*fB)();
fB* func;
int* vptr = (int*)obj; //2. Accessing the vptr
func = (fB*)(*vptr);
func[1](); //3. Calling funcB using vptr.
聲明1.即obj-> funcB();甚至沒有編譯,儘管Vtable有一個funcB的條目,在那裏訪問vPtr間接funcB()可以被成功調用。
編譯器如何決定何時使用vTable來調用函數? 在聲明中A * obj = new B();因爲我使用的是基類指針,所以我認爲應該使用vtable來調用函數。
以下是間接訪問vptr時的內存佈局。
下面的(2)行表現出未定義的行爲。 「似乎工作」是未定義行爲的一種可能表現形式。 –
當然,它不會編譯。沒有'A :: funcB()'。 – Barry
'編譯器如何決定何時使用vTable來調用一個函數?它決定這麼做是爲了滿足C++語言的指定語義。爲什麼你關心這些實現細節?你想解決什麼問題? –