Я не уверен, что вопрос уже решен. Я проверял одну из функций переполнения стека и получил это сомнение.
Давайте сначала проверим код:
#include <string>
#include <map>
#include <iostream.h>
class MyClass
{
public:
virtual int Func()
{
return 0;
}
int Func2()
{
return 0;
}
};
class MyClass2 : public MyClass
{
public:
int Func( )
{
return 1;
}
int Func2()
{
return 1;
}
};
class Processor
{
private:
typedef int (MyClass::*MemFuncGetter)();
static std::map<std::string, MemFuncGetter> descrToFuncMap;
public:
static void Initialize();
void Process(MyClass* m, const std::string&);
};
std::map<std::string, Processor::MemFuncGetter> Processor::descrToFuncMap;
void Processor::Initialize()
{
descrToFuncMap["Func"]=&MyClass::Func;
descrToFuncMap["Func2"]=&MyClass::Func2;
};
void Processor::Process(MyClass* ms, const std::string& key)
{
std::map<std::string, MemFuncGetter>::iterator found = descrToFuncMap.find(key);
if(found != descrToFuncMap.end())
{
MemFuncGetter memFunc = found->second;
int dResult = (ms->*memFunc)();
cout << "Result is : "<< dResult <<endl;
}
}
int main(int argc, char* argv[])
{
Processor::Initialize();
Processor p;
MyClass *pMC2 = new MyClass2;
p.Process(pMC2, "Func");
p.Process(pMC2, "Func2");
delete pMC2;
pMC2 = NULL;
return 0;
}
В этом примере результат, как и ожидалось:
Result is : 1
Result is : 0
Но когда я отлаживал с помощью отладчика VC 6 и наблюдал значение memFunc в Processor :: Process и нашел следующие значения:
In p.Process (pMC2, "Func"); звоните
memFunc 0x004011bd [thunk]:`vcall'{0,{flat}}'
In p.Process (pMC2, "Func2"); звоните
memFunc 0x0040118b MyClass::Func2(void)
Я не понял thunk и flat в "[thunk]:` vcall '{0, {flat}} "?
Может ли кто-нибудь помочь мне понять внутренности здесь?