c++ - 如何私有(private)继承基类的派生类,但实现基类的公共(public)接口(interface)?

标签 c++ inheritance encapsulation

假设库中有两个不可更改的类,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 的接口(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。但是在我的例子中,AB 类是不可编辑的,为了虚拟继承在这里工作,我需要 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;
};

Working example .

关于c++ - 如何私有(private)继承基类的派生类,但实现基类的公共(public)接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653455/

相关文章:

c++ - 如何将这个成对列表转换为包含数组数组的对象?

c# - 制作只读本地字符串 C#

c# - 公共(public)实例变量访问错误: "An object reference is required for the non-static field, method, or property..."

java - 从子类调用父类(super class)的方法返回值 0

c++ - 工厂内部的对数返回类型搜索

delphi - 使用字符串形式的类名确定 Delphi 6 类对象是否是派生类?

oop - 有没有办法为 S4 引用类声明公共(public)和私有(private)方法?

c++ - 将摩尔斯电码插入二叉树

c++ - 如何获取当前目录并将其分配给Linux中的变量

c++ - C++中的线程池 - 如何结束程序