【发布时间】:2018-05-19 02:30:28
【问题描述】:
假设库中有两个不可更改的类,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?
【问题讨论】:
-
但我不希望 C 成为 B
-
@skypjack 是的,我想让
C实现A的虚方法。 -
既然 B 是 A,那么 C 转换为 B 有什么关系呢?它也可以转换为 A,因为 B 是 A。
-
@ttemple 因为
B有一些我不想在C中公开的额外功能。 -
使 C 从 A 继承,将 B 的实现移动到单独的 h 和 cpp 中,在 B.cpp 和 C.cpp 中包含并使用此实现
标签: c++ inheritance encapsulation