当前位置:  开发笔记 > 编程语言 > 正文

通过存储指向成员函数的指针来实现虚拟行为

如何解决《通过存储指向成员函数的指针来实现虚拟行为》经验,为你挑选了1个好方法。



1> Eclipse..:

这一行在这里:

void Processor::Process(MyClass ms, const std::string& key)

尝试替换它

void Processor::Process(MyClass &ms, const std::string& key)

正在发生的事情被称为切片,即使您可能已经传入了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 descrToFuncMap;
};

void Processor::Initialize()
{
     descrToFuncMap["X"]=&MyClass::GetX;
}

void Processor::Process(MyClass *ms, const std::string& key)
{
     map::iterator found=descrToFuncMap.find(key);
     if(found!=descrToFuncMap.end())
     {
        MemFuncGetter memFunc=found->second;
        double dResult=(ms->*memFunc)();
        std::cout<<"Command="<

哪个输出:

Command = X,结果= 1

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有