请考虑以下几点:
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()。
2条答案
按热度按时间ovfsdjhp1#
不,你也不应该想这样做,你自己做的任何事情最终都会表现得像
virtual
一样。仅仅因为你没有访问
RecordCLDT
的任何数据成员,并不意味着你可以使它成为静态的,你仍然需要它是一个override
的基类成员来调用正确的东西。daolsyd02#
virtual
函数之所以有效,是因为对象中隐藏了一些信息,这些信息告诉系统指针/引用 * 实际上 * 指向的是哪个对象。这就是为什么要为给定的对象调用正确的函数。如果你想删除
virtual
函数,你必须 * 替换 * 这个功能,也就是说,你必须在对象中有 * 显式 * 数据,而不是在对象中有隐藏的数据来说明它是哪种类型的对象,不同的函数将查看哪些数据来告诉它实际上是哪种类型,从而如何行为。这不是一件小事,如何最好地完成它取决于各种因素。你不能只是创建一个
static
成员,去掉一些virtual
,然后期望一切仍然工作。说明对象类型的数据仍然必须存在,并且必须可以从基类访问。如果你删除隐式数据,你必须添加显式数据。