从基类构造函数调用派生类的方法
Calling a method of a derived class from base class constructor
我有一个情况,我希望System
的每个派生实例通过我自己的事件系统订阅一个事件。基本上,这意味着将std::函数传递给事件,该事件是另一个实例的成员字段。它基本上是这样的:
// System.h
class System
{
public:
System(std::shared_ptr<EntityManager> entityManagerPtr);
virtual ~System();
virtual void componentAddedEventHandler(void* source, const ComponentAddedEventArgs& args);
protected:
std::shared_ptr<EntityManager> m_entityManagerPtr;
};
和实现,使用委托:
// System.cpp
System::System(std::shared_ptr<EntityManager> entityManagerPtr) : m_entityManagerPtr(entityManagerPtr)
{
// Subscribe to the componentAddedEvent
m_entityManagerPtr->componentAddedEvent += [&](void* source, ComponentAddedEventArgs args) {
this->componentAddedEventHandler(source, args);
};
}
但很明显,如果没有定义System::componentAddedEventHandler()
,这将无法编译。
确保从System
派生的每个类都订阅事件的最佳方法是什么,并且它们都必须为事件处理程序定义自己的实现?或者仅仅是强迫这样的行为太不方便了,所以应该用其他方式来实现?
OP在评论中说(强调我的):
我想我想有所有类派生自
System
订阅一个事件,和被迫实现自己的处理程序说的事件。
"从X派生的所有类"answers"被迫"在同一句话中要求使用纯虚成员函数。
struct System
{
virtual void foo() = 0;
};
struct Subsystem : public System
{
virtual void foo() override { /* forced to implement this */ }
};
如果你用智能指针存储你的系统(也许在容器中),你可以为每个系统调用foo()
,并确保获得派生类的行为。
这些都很好,但是你不能从基类的构造函数中调用foo()
。一个低技术含量的解决方案是使用工厂函数来构造每个对象。
template <typename T>
unique_ptr<T> make_system()
{
auto obj = make_unique<T>();
obj->foo();
return obj;
}
auto s1 = make_system<Subsystem1>();
auto s2 = make_system<Subsystem2>();
这两个对象都被强制实现foo()
,并且在使用之前都调用了foo()
。这仍然是两阶段初始化,但是它隐藏在函数调用后面。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 为什么此派生对象无法访问基类的后递减方法?
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用基类中的派生方法运行线程,而无需使用模板
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 在派生类中使用基类的私有成员变量的最佳方法
- 如何在从抽象基派生的类中实现相同的方法?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 从基类实例调用派生类方法而不进行强制转换
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C ++基础私有方法在将自身转换为派生类后可以访问吗?
- C++ 使用派生类方法更改基类数据成员
- 如何使用派生类特定的方法:派生类中的派生成员
- 使用抽象类的指针访问派生类的方法;派生类似乎也是抽象的