4

我有一些课,比如

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

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

4

2 回答 2

8

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

constexpr virtual std::string name() = 0;
于 2012-08-15T10:03:03.107 回答
6

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

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

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

于 2012-08-15T10:41:22.453 回答