我可以部分实现接口层次结构吗?
Posted
技术标签:
【中文标题】我可以部分实现接口层次结构吗?【英文标题】:Can I partially implement an interface hierarchy? 【发布时间】:2013-12-18 14:40:06 【问题描述】:我正在写一个类似这样的界面:
class BaseInterface
virtual void MethodA() = 0;
class DerivedInterface : public BaseInterface
virtual void MethodB() = 0;
我想创建一个类Derived
,它是-a DerivedInterface
(隐含地,是-a BaseInterface
,尤其是Base
)。也就是说,我只想在 Derived
类中定义 MethodB
- 我想在其他地方部分指定接口(即 MethodA
)。
class Base : public BaseInterface
virtual void MethodA() ...;
class Derived : public DerivedInterface // somehow include Base as well
void MethodB() ...;
这在 C++ 中可行吗?
【问题讨论】:
忘记了virtual
?
如果它不在Derived
的继承链中,它将无法工作,我很确定菱形链也不会在这里工作。 (即类似class Derived : public Base, public DerivedInterface
)
@Jefffrey 我做到了,谢谢 :)
但真的需要吗?我的意思是虚拟关键字不是那么隐含!
@BhupeshPant:默认情况下,成员函数在 C++ 中是非虚函数,因此您必须明确说明它,至少在第一次声明时是这样。
【参考方案1】:
使用虚拟继承,避免成员重复:
class BaseInterface
public:
virtual void MethodA() = 0;
;
class DerivedInterface : virtual public BaseInterface
public:
virtual void MethodB() = 0;
;
class Base : virtual public BaseInterface
public:
virtual ~Base()
virtual void MethodA() ;
;
class Derived : public Base, virtual public DerivedInterface
public:
virtual void MethodB() ;
;
int main()
Derived d;
d.MethodA();
d.MethodB();
如果没有虚拟继承,Derived 有两个 MethodA,需要在 Derived 中额外覆盖:
virtual void MethodA() override Base::MethodA();
不过,这破坏了界面设计!
没有派生接口可能更简洁:
class FirstInterface;
class SecondInterface;
class Base : public virtual FirstInterface;
class Derived : public Base, virtual public SecondInterface;
这避免了重复,即使没有虚拟继承。 (为了避免麻烦,我也会使用虚拟接口继承)
【讨论】:
【参考方案2】:多重继承是它的完美答案。
class Derived : public Base, virtual public DerivedInterface
public:
virtual void MethodB() ;
;
现在你有两个成员...
【讨论】:
这是不正确的,请参考 Dieter Lücking 的回答以了解如何做到这一点。 很抱歉,您的回答仍然不正确,请参阅 Dieter Lücking 的回答以了解在何处使用虚拟继承。以上是关于我可以部分实现接口层次结构吗?的主要内容,如果未能解决你的问题,请参考以下文章