c++ 有没有可能在不进行重大重构的情况下将虚非静态方法转换为静态方法?

oewdyzsn  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(71)

请考虑以下几点:

class RecordCommon {
public:
   virtual const char* GetShortName(void) const = 0;
   ...
   virtual void DoSomeWork(void);
};

class RecordCLDT : public RecordCommon {
   virtual const char* GetShortName(void) const { return "CLDT"; }
};

void RecordCommon::DoSomeWork(void) {
   ...
   log(GetShortName());
   ...
}

我想要的是像RecordCLDT::GetShortName(void)这样的静态方法,它会返回"CLDT"而不需要对项目进行主要的重构。也许这可以通过一些宏或智能模板技术来实现?
我需要让RecordCommon::DoSomeWork(void)调用正确的GetShortName()函数,如果我只是用静态函数替换虚拟的GetShortName(),它就不会调用。
重写RecordCommon的每个子类将非常耗时,特别是因为代码中使用了虚拟GetShortName()。

ovfsdjhp

ovfsdjhp1#

不,你也不应该想这样做,你自己做的任何事情最终都会表现得像virtual一样。
仅仅因为你没有访问RecordCLDT的任何数据成员,并不意味着你可以使它成为静态的,你仍然需要它是一个override的基类成员来调用正确的东西。

daolsyd0

daolsyd02#

virtual函数之所以有效,是因为对象中隐藏了一些信息,这些信息告诉系统指针/引用 * 实际上 * 指向的是哪个对象。这就是为什么要为给定的对象调用正确的函数。
如果你想删除virtual函数,你必须 * 替换 * 这个功能,也就是说,你必须在对象中有 * 显式 * 数据,而不是在对象中有隐藏的数据来说明它是哪种类型的对象,不同的函数将查看哪些数据来告诉它实际上是哪种类型,从而如何行为。
这不是一件小事,如何最好地完成它取决于各种因素。你不能只是创建一个static成员,去掉一些virtual,然后期望一切仍然工作。说明对象类型的数据仍然必须存在,并且必须可以从基类访问。如果你删除隐式数据,你必须添加显式数据。

相关问题