如何私下从基类的导数继承,但实现基类的公共接口?

How to inherit privately from a base class' derivative, but implement public interface of the base class?

本文关键字:基类 实现 接口 继承 何私下      更新时间:2023-10-16

假设库中有两个不可更改的类,AB,相关如下:

class A
{
public:
virtual void doCustomThings() = 0;
virtual void doOtherThings() = 0;
void doSomething();
private:
SomeType1 someData;
};
class B : public A
{
public:
void doCustomThings() override;
void doOtherThings() override;
void someUsefulUtility();
private:
SomeType2 otherData;
};

我正在尝试根据B中可用的接口实现A接口,所以我这样做:

class C : public B
{
public:
void doCustomThings() override; // uses B::someUsefulUtility()
// leave B::doOtherThings() not overridden
private:
SomeType3 myData;
};

但我不打算CB,即我不希望对C的引用隐式转换为B&,尽管它应该是可转换为A&的。

首先想到的是使用虚拟继承,然后继承public A, private B。但是在我的情况下,A类和B类是不可编辑的,为了使虚拟继承在这里起作用,我需要class B继承为public virtual A

另一个想法是考虑组合而不是继承。但是,如果我从A派生出来,并以私人成员的身份B,我将毫无用处地拥有两次A::someData,这看起来不优雅。

有没有像class C : public A, private B这样的东西,这样就只有一个基类A,考虑到上面提到的约束?

是的,使用私有继承并使用using公开所需的成员。

class C : private B
{
public:
using B::A;// to make it convertible to A
using B::doOtherThings;
void doCustomThings() override {
std::cout<<"C::doCustomThings()n";    
}
private:
char myData;
};

工作示例。

是的,只对A使用继承,对B使用组合,并委托给B成员(不是基)

class C : public A
{
public:
void doOtherThings() override { myB.doOtherThings(); }
void doCustomThings() override {
std::cout<<"C::doCustomThings()n";    
}
private:
B myB;
SomeType3 myData;
};