我有一个Base
类和一个Derived
类。 Base
类的唯一目标是确保Derived
实现成员函数。
struct Base
{
virtual void f() = 0;
};
struct Derived : Base
{
void f() override final {}
};
我不会多态地使用此类,即,我只是实例化堆栈上类型为Derived
的对象,如下所示:
Derived obj;
而且我需要这样做数百万次。
Edit:同时只有几个实例(没有堆栈溢出)。
是否在这里创建了vtable
(我猜是在编译期间)?是否创建vtable
对我来说很重要,因为我不使用它(或者我是否以某种方式)?我应该考虑使用这种设计吗?也许还有另一种方法可以确保编译器在Derived
未实现f()
时抱怨?
是否在此处创建了vtable?
是,因为您具有virtual
成员函数。
是否创建了vtable对我来说很重要,因为我不使用它?
由于您不使用它,因此它在一定程度上仍然很重要,因为它将增加Derived
结构的大小。这里您的Derived
结构的大小为8。但是如果没有vtable,它的大小将为1。
也许还有另一种方法来确保编译器在
Derived
未实现f()
时抱怨?
老实说,我认为您使用Base
作为接口以强制每个派生类实现f()
函数的解决方案是完全可以的,因为它是使用接口的确切用例] >。
但是如果您担心Derived
结构的大小(因为您说过要实例化它数百万次),也许您会对std::is_member_function_pointer
类型特征感兴趣。
我不知道您打算如何实例化std::is_member_function_pointer
结构,因此我无法提供完全适合您需要的代码。但是我正在考虑的想法等同于以下示例(通用示例):
Derived
但是请记住,这种方法的缺点是延迟了检查。当遇到结构定义但在评估
#include <type_traits> template <typename T> void instantiate_a_lot_of_times(std::size_t nb_times) { // Check if the f() member function exists static_assert(std::is_member_function_pointer<decltype(&T::f)>::value, "Error: The T::f() member function must be defined"); for(std::size_t i = 0; i < nb_times; ++i) { T t; // Do something with t } }
时,编译不会失败。