从两个'interfaces'实现相同的方法签名
Implementing the same method signature from two 'interfaces'
在c++中使用纯虚方法的人造接口,当一个具体类派生自两个具有相同方法声明的"接口"时会发生什么?例如X
子类Iaaa
和Ibbb
,并实现了virtual void setVisible(bool);
方法。
是否Iaaa
和Ibbb
没有方法体的事实使事情比更经典的钻石继承场景更容易/更好,并且让X::setVisible
成为Iaaa::setVisible
和Ibbb::setVisible
的实现?
我想用更c++的方式来表达这个问题是"当一个类使用MI从两个具有相同签名的纯虚方法的类派生时会发生什么"
当一个类使用MI从两个类派生时会发生什么对纯虚方法具有相同的签名
行为定义良好。派生类重写方法将构成两个接口(即抽象class
和所有纯virtual
函数)方法的实现。
还有,你的问题中的另外两点
- 钻石继承还没有发生,因为你还没有提到
Iaaa
和Ibbb
的通用碱基 - 你不能实现,2
X::setVisible(bool)
与相同的签名
看情况。如果两个函数有相同的签名,你想用相同的函数替换它们,然后这样做;有没问题,您的函数将实现这两种方法。如果他们有不同的签名,那么就需要两个不同的函数来实现它们。如果你想要不同的实现(可能是如果接口不相关),但它们具有相同的签名,然后你需要引入中间类来"重命名"它们,例如:
class MaskSetVisibleInAaa : public Aaa
{
virtual void setVisibleInAaa( bool ) = 0;
virtual void setVisible( bool newStatus )
{
setVisibleInAaa( newStatus );
}
};
class MaskSetVisibleInBbb : public Bbb
{
virtual void setVisibleInBbb( bool ) = 0;
virtual void setVisible( bool newStatus )
{
setVisibleInBbb( newStatus );
}
};
class ConcreteImplementation
: public MaskSetVisibleInAaa
, public MaskSetVisibleInBbb
{
virtual void setVisibleInAaa( bool );
virtual void setVisibleInBbb( bool );
};
(我也会质疑你对"人造界面"的使用。c++完全支持实际上,真正的接口比其他语言更重要有一个interface
关键字。接口定义了一个契约;哪一个除非该语言对契约式编程有特殊支持,在大多数情况下,在接口中暗含具体代码,带有虚代码函数是私有的
相关文章:
- 使用非递归插入方法实现 AVL 树
- C++方法实现:是否可以避免每次都键入类名?
- 如何使用吸气剂方法实现C++封装
- 在C++中使用克隆方法实现多晶型效果
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 双向链表插入方法实现 - 正在搜索哪个节点
- 没有虚拟调度的默认方法实现
- C 构造函数和方法实现
- C :如何使用相同的数据类使用不同的方法实现
- 将同一类的方法实现放在不同的对象文件中
- 私有方法实现编译错误
- 使用公共命名方法实现非公共赋值运算符
- 使用 SFINAE 在 Clase 模板中选择不同的方法实现
- 如何根据方法实现的声明顺序对其进行排序
- 使用一个方法实现不同类型赋值的优雅方式,并且没有警告
- 在运行时选择方法实现
- 将参数传递给c++ CORBA方法实现
- 静态constexpr方法实现导致GCC错误
- 包括c++中的头文件(类定义和方法实现)
- 如何在swig生成的代理类中更改特定的方法实现