哪个基类调用派生重写的方法?
Which base class is calling derived overridden method?
我有以下使用多重继承的代码。目的是在派生类中使用两个接口作为一个接口:
struct InterfaceA
{
virtual void register_stuff();
virtual void on_state_changed( const State state ) = 0;
};
struct InterfaceB
{
virtual void register_stuff();
virtual void on_state_changed( const State state ) = 0;
};
struct Derived : InterfaceA, InterfaceB
{
void register_stuff() override
{
InterfaceA::register_stuff();
InterfaceB::register_stuff();
}
void on_state_changed( const State state ) override
{
// how can I know who is responding?
}
};
注册接口将导致异步调用on_state_changed
。是否可以辨别哪个接口在调用它?
您必须在中间添加一层以消除歧义。这里有一个小实用程序,可以动态创建它们:
template<class Inteface>
struct disambiguate : Interface {
void on_state_changed( const State state ) override final {
on_state_changed(state, this);
}
virtual void on_state_changed( const State &state, disambiguate* ) = 0;
};
仅此而已。然后是在此实用程序中定义类的问题:
struct Derived : disambiguate<InterfaceA>, disambiguate<InterfaceB>
{
void register_stuff() override
{
InterfaceA::register_stuff();
InterfaceB::register_stuff();
}
void on_state_changed( const State &state, disambiguate<InterfaceA>* ) override
{
// Called for A
}
void on_state_changed( const State &state, disambiguate<InterfaceB>* ) override
{
// Called for B
}
};
我使用了另一个参数和重载来使其模板化,但技术本身也可以通过写出类并使用新名称调用虚拟函数来完成。关键是使原始虚拟调用(通过接口指针(到达调用消除歧义函数的短速。
或者,可以直接在 Derived 的代码中为处理程序提供单独的实现:
struct Derived : InterfaceA, InterfaceB
{
void register_stuff() override
{
InterfaceA::register_stuff();
InterfaceB::register_stuff();
}
void InterfaceA::on_state_changed( const State state ) override
{
// responding A
}
void InterfaceB::on_state_changed( const State state ) override
{
// responding B
}
};
编辑:不幸的是,此解决方案是非标准的,仅受Visual C++编译器支持。
我也在考虑使用模板来消除歧义,但我相信@StoryTeller的答案更优雅。
struct InterfaceA
{
virtual void register_stuff(); // calls on_state_changed<InterfaceA>()
template <typename Interface>
virtual void on_state_changed( const State state ) = 0;
};
struct InterfaceB
{
virtual void register_stuff(); // calls on_state_changed<InterfaceB>()
template <typename Interface>
virtual void on_state_changed( const State state ) = 0;
};
struct Derived : InterfaceA, InterfaceB
{
void register_stuff() override
{
InterfaceA::register_stuff();
InterfaceB::register_stuff();
}
template <typename Interface>
void on_state_changed( const State state ) override
{
// how can I know who is responding?
// : "Interface" is responding
}
};
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 方法重写线程C++中的概念
- 如何强制从重写方法调用重写的方法基方法?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- C++有没有办法强制重写一组方法,如果其中一个方法在子类中具有重写?
- 在 C++ 中使用模板方法重写类方法
- 检查子类是否执行了方法重写
- C++方法重写和重载(编译器级别)
- 用模板方法重写虚拟方法
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分
- C++ - 方法重写未按预期表示
- 使用两种方法重写<<运算符
- C++阻止方法重写
- C++方法重写
- c++在具体类中强制方法重写
- 方法重载和方法重写的性能问题
- C++中的方法重写是否总是在派生类的标头中完成?
- 是否有更好的方法重写此代码片段
- 为什么静态方法重写基类非静态方法
- 方法重写