1 c++
为什么要阻止虚拟行为?
class MyClass
{
//........
virtual double GetX();
virtual double GetSomethingElse();
virtual double GetT();
virtual double GetRR();
//........
};
class Processor
{
private:
typedef double (MyClass::*MemFuncGetter)();
static map<std::string, MemFuncGetter> descrToFuncMap;
public:
static void Initialize();
void Process(Myclass m, string);
};
void Processor::Initialize()
{
descrToFuncMap["X"]=&MyClass::GetX;
descrToFuncMap["SomethingElse"]=&MyClass::GetSomethingElse;
descrToFuncMap["RR"]=&MyClass::GetRR;
descrToFuncMap["T"]=&MyClass::GetT;
};
void Processor::Process(MyClass *ms, const std::string& key)
{
map<std::string, Getter>::iterator found=descrToFuncMap.find(key);
if(found!=descrToFuncMap.end())
{
MemFuncGetter memFunc=found->second;
double dResult=(ms).*memFunc();
std::cout<<"Command="<<key<<", and result="<<result<<std::end;
}
}
Run Code Online (Sandbox Code Playgroud)
这一行在这里:
void Processor::Process(MyClass ms, const std::string& key)
Run Code Online (Sandbox Code Playgroud)
尝试替换它
void Processor::Process(MyClass &ms, const std::string& key)
Run Code Online (Sandbox Code Playgroud)
正在发生的事情被称为切片,即使您可能已经传入了MyClass的子类,当您调用Process时,使用MyCLass的复制构造函数在堆栈上创建一个新的MyClass对象.这个新对象无论如何都是MyClass,包括拥有MyClass的虚拟表.
当您通过引用或使用指针传递时,不会进行任何复制,并且对MyClass的引用可以引用实际上属于SubClassOfMyClass类型的对象.
编辑:
好吧,问题在于许多编译错误中的一个,如果你把这一切都编译好,它就可以了:
class MyClass
{
public:
//........
virtual double GetX() { return 0.0; }
};
class MyClass2 : public MyClass
{
public:
//........
virtual double GetX() { return 1.0; }
};
class Processor
{
public:
typedef double (MyClass::*MemFuncGetter)();
static void Initialize();
void Process(MyClass *m, const string &);
private:
static map<std::string, MemFuncGetter> descrToFuncMap;
};
void Processor::Initialize()
{
descrToFuncMap["X"]=&MyClass::GetX;
}
void Processor::Process(MyClass *ms, const std::string& key)
{
map<std::string, MemFuncGetter>::iterator found=descrToFuncMap.find(key);
if(found!=descrToFuncMap.end())
{
MemFuncGetter memFunc=found->second;
double dResult=(ms->*memFunc)();
std::cout<<"Command="<<key<<", and result="<<dResult<<std::endl;
}
}
map<std::string, Processor::MemFuncGetter> Processor::descrToFuncMap;
int main()
{
Processor::Initialize();
Processor p;
MyClass2 mc2;
p.Process(&mc2, "X");
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Command = X,结果= 1