我正在编写一个类似于以下的接口:
class BaseInterface
{
virtual void MethodA() = 0;
}
class DerivedInterface : public BaseInterface
{
virtual void MethodB() = 0;
}
我想创建一个类Derived
,它是一个DerivedInterface
(并且,隐含地,它是BaseInterface
,特别是Base
)。也就是说,我只想定义MethodB
,但在类Derived
中,我想在其他地方部分指定接口(即MethodA
)。
class Base : public BaseInterface
{
virtual void MethodA() {...};
}
class Derived : public DerivedInterface // somehow include Base as well
{
void MethodB() {...};
}
这在C++中可能吗?
使用虚拟继承,以避免成员重复:
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;
这避免了重复,即使没有虚拟继承。(为了避免以后的麻烦,我也会使用虚拟接口继承)
多重继承是完美的答案。
class Derived : public Base, virtual public DerivedInterface
{
public:
virtual void MethodB() {};
};
现在你有两个成员。。。