如何私下从基类的导数继承,但实现基类的公共接口?
How to inherit privately from a base class' derivative, but implement public interface of the base class?
假设库中有两个不可更改的类,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
接口,所以我这样做:
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 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;
};
相关文章:
- 如何正确实现与基类不同的版本?
- 可以具有不同基成员实现的类的最佳实现
- 对派生自同一基类的类实现冲突检查
- 无法使用在子类中定义的虚拟getter实现基类
- 关于C++从派生类调用在基类中实现的虚拟函数的问题
- 如何在基类中定义静态接口,并确保该接口必须在派生类中实现
- 如何在CRTP实现中传递基类指针
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 如何在子类中重写时调用私有虚拟基类实现
- C++通过映射并使用中的方法从基类实现派生类
- 允许其他基类实现虚拟函数
- 我可以从不同的基类实现对同一函数的不同实现吗?
- CRTP - 如何从派生类调用方法的基类实现
- 为什么C++不允许基类实现派生类的继承接口?
- 从static中派生的基类实现一个虚拟方法
- 使用模板和基类实现灵活的数组成员
- 如何让派生类使用基类实现来满足接口
- 如果我想使用基类实现,为什么我必须在派生类中实现虚函数?
- 基类实现能否代表接口的纯虚拟方法