【问题标题】:C++ force overrideC++ 强制覆盖
【发布时间】:2012-08-15 10:02:02
【问题描述】:

我有一些课,比如

class object {
public:
virtual std::string name() const; 
};

它提供了一些接口,我希望所有派生都覆盖方法name。 问题是,它没有被覆盖,编译时没有任何问题,但我在运行时遇到问题。 有没有办法强制方法覆盖? 编辑:我想在所有衍生品中强制执行覆盖,而不仅仅是直接后代!

【问题讨论】:

  • 我怀疑这是否会正确构建。您应该会收到链接器错误。
  • 是的,我没有打印定义。为什么?一切都与接口有关。
  • 您是否考虑过使用 RTTI 代替?
  • @KerrekSB: 已经 std::string 并且没有被定义为 inlnie 作为 constexpr 应该会出错
  • 我真的觉得这里有XY问题...

标签: c++ c++11 overriding virtual


【解决方案1】:

是的,让它成为一个虚拟的:

constexpr virtual std::string name() = 0;

【讨论】:

  • 那又怎样?它在第一个导数中强制覆盖,而不是所有后续!
  • @illusionoflife 您没有在问题中指定该要求。
  • all derivated。好吧,这可能并不明显。将编辑。
【解决方案2】:

您可以通过检查成员指针类型来检查成员是否在基类中定义:

static_assert(std::is_same<decltype(&U::name), std::string (U::*)()>::value,
              "name must be defined directly in U");

这确实意味着在编译时您必须有权访问您感兴趣的所有后代类型。

【讨论】:

  • 嗯,它需要将代码添加到后代中,而不是对象中。但它仍然会有所帮助。谢谢!
猜你喜欢
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多