假设库中有两个不可更改的类,A
和 B
,它们之间的关系如下:
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
的接口(interface),所以我这样做:
class C : public B
{
public:
void doCustomThings() override; // uses B::someUsefulUtility()
// leave B::doOtherThings() not overridden
private:
SomeType3 myData;
};
但我不希望 C
成为 B
,即我不想引用 C
可以隐式转换为 B&
,尽管它应该可以转换为 A&
。
首先想到的是使用虚继承,然后继承public A,private B
。但是在我的例子中,A
和 B
类是不可编辑的,为了虚拟继承在这里工作,我需要 class B
继承为 公共(public)虚拟A
。
另一个想法是考虑组合而不是继承。但是,如果我从 A
派生并将 B
作为私有(private)成员,我将无用地拥有两次 A::someData
,这看起来很不雅观。
是否有任何好的方法来实现类似 class C : public A, private B
的东西,这样就只有一个基类 A
,鉴于上述情况提到约束?
最佳答案
是的,使用私有(private)继承并通过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;
};
关于c++ - 如何私有(private)继承基类的派生类,但实现基类的公共(public)接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653455/