【问题标题】:Avoid re-implementation of a method call in each derived class避免在每个派生类中重新实现方法调用
【发布时间】:2016-12-08 10:41:47
【问题描述】:

我有一个抽象类及其派生类。

我想在抽象类中拥有一个成员(即 fDerivedName),并使用派生类的名称。

在我做的每个派生类的构造函数中:

fDerivedName = this->ClassName();

有没有办法避免在每个派生类中重新实现 this?

谢谢

【问题讨论】:

  • 你能发个minimal reproducible example吗?
  • 是的。 CRTP。当您可以直接调用ClassName() 时,您根本不清楚为什么需要fDerivedName,但是是的,如果您需要它,您可以拥有它。
  • 你可以使用宏来简化重新实现
  • @n.m.我不确定 CRTP 如何检索派生类名称。还是你在想typeid
  • @Quentin 我假设 ClassName() 以某种方式实现(typeid 与否)。如果不是这样,那么“如何实现 ClassName()”就是另外一个问题了。

标签: c++


【解决方案1】:

您可以在基类中实现构造函数(不再是纯抽象的),将派生类的名称作为参数传递,并在构造函数的初始化列表中进行赋值:

class Base
{
public:
   Base( const std::string& derived_class_name):
      fDerivedName( derived_class_name)
   {
   }
   ...
};

但是,当然,您仍然必须从派生类的每个构造函数中调用这个基类构造函数。而且您必须将类名作为参数传递,例如,您不能调用派生类重载的虚函数ClassName()

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多