2012-08-15 75 views
4

我有一些类,像C++重写力

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

它提供了一些接口,我希望所有衍生成覆盖方法name。 问题是,它没有被覆盖,在编译时没有任何中断,但我在运行时遇到问题。 是否有任何方法来强制方法重写? 编辑:我想在所有衍生物强制执行重写,而不仅仅是直接贬低者!

+0

我想问题是这样可以正确地编译。你应该会得到链接错误。 – 2012-08-15 10:08:56

+0

是的,我没有打印定义。为什么?这完全是关于接口。 – KAction 2012-08-15 10:10:15

+0

您是否考虑过使用RTTI? – 2012-08-15 10:16:27

回答

6

可以检查部件是否在基类中定义通过检查它的指针到成员类型:

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

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

+0

好吧,它需要将代码添加到后代,而不是添加到对象中。但它仍然有帮助。谢谢! – KAction 2012-08-15 10:45:36

8

是的,使之成为虚拟:

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

那么什么?它在第一个派生中执行重写,而不是所有的后续! – KAction 2012-08-15 10:09:20

+0

@illusionoflife您没有在您的问题中指定该要求。 – ecatmur 2012-08-15 10:12:39

+0

'所有衍生'。那么,它可能并不是显而易见的。将编辑。 – KAction 2012-08-15 10:15:24