我正在使用Eckel的「Thinking in C++」學習C++。它聲明如下:Visual C++編譯器如何將此ptr傳遞給被調用的函數?
- 如果一個類包含虛擬方法,則爲該類創建一個虛擬函數表等。函數表的工作原理將被粗略地解釋。 (我知道一個vtable不是強制性的,但Visual C++創建了一個。)
- 調用對象作爲參數傳遞給被調用的函數。 (這可能不適用於Visual C++(或任何編譯器))。我試圖找出VC++如何將調用對象傳遞給該函數。
要在Visual C測試兩個點++,我創建了下面的類(使用Visual Studio 2010,WinXP的家庭32位):
ByteExaminer.h:
#pragma once
class ByteExaminer
{
public:
short b[2];
ByteExaminer(void);
virtual void f() const;
virtual void g() const;
void bruteFG();
};
ByteExaminer.cpp :
#include "StdAfx.h"
#include "ByteExaminer.h"
using namespace std;
ByteExaminer::ByteExaminer(void)
{
b[0] = 25;
b[1] = 26;
}
void ByteExaminer::f(void) const
{
cout << "virtual f(); b[0]: " << hex << b[0] << endl;
}
void ByteExaminer::g(void) const
{
cout << "virtual g(); b[1]: " << hex << b[1] << endl;
}
void ByteExaminer::bruteFG(void)
{
int *mem = reinterpret_cast<int*>(this);
void (*fg[])(ByteExaminer*) = { (void (*)(ByteExaminer*))(*((int *)*mem)), (void (*)(ByteExaminer*))(*((int *)(*mem + 4))) };
fg[0](this);
fg[1](this);
}
通過虛表中bruteFG()
作品導航 - 當我打電話fg[0](this)
,調用。但是,不起作用的是將this
傳遞給該函數 - 意味着this->b[0]
未正確打印(垃圾出來,實際上我很幸運,這不會產生段錯誤)。
所以對於
ByteExaminer be;
be.bruteFG();
實際產量:
virtual f(); b[0]: 1307
virtual g(); b[1]: 0
所以我應該怎麼着手得到正確的結果? this
指針如何傳遞給VC++中的函數? (Nota bene:我不會嚴肅地編程這種方式,這是「爲了lulz」或學習經驗,所以不要試圖將我轉換爲適當的C++ ianity: ))
你只是好奇它是如何工作的(DeadMG的答案應該滿足你的需求),還是你在尋找類似於指向成員操作符(它是C++語言的一部分)或'代表'的東西有幾種實現(因爲指向成員的操作符有限制),包括在Boost或TR1中? –