从抽象类继承时,“公共”和“私有”继承之间的区别

Difference between `public` and `private` inheritance when inheriting from abstract classes

提问人:Christopher Miller 提问时间:10/13/2023 最后编辑:Christopher Miller 更新时间:10/13/2023 访问量:124

问:

我有一个班级:Placeable

struct Placeable {
    virtual void place_at(int x, int y) const {}

    virtual ~Placeable() = default;
};

我还有其他几种类型,例如 ,它们继承自 ,并覆盖函数。BoxPlaceableplace_at()

struct Box : Placeable {  /* Private inheritance for now (by default) */
    void place_at(int x, int y) const override {
        /* ...Code... */
    }
};

正如你可能知道的,我打算成为一个抽象类,只有函数,没有成员变量,以便指定继承类型的接口。但是,我不确定我应该在 Box 和其他相关类型上使用哪种类型的继承Placeable

我了解到,在继承中,基类的成员可以从派生类访问,而在继承中,它们不是(我怀疑继承是我在这里寻找的,所以我把它省略了。让我知道我是否应该使用它)。但是,由于没有成员变量,这里的公共继承和私有继承之间有什么区别吗?当我运行此测试代码时:publicprivateprotectedPlaceable

#include <iostream>

struct Placeable {
    virtual void place_at(int x, int y) const {}

    virtual ~Placeable() = default;
};

struct Box : Placeable {  /* private by default, try changing to public */
    void place_at(int x, int y) const override {
        /* ...Code... */
    }
};

int main()
{
    Placeable *ptr = new Box();

    /* Calls `Box::place_at()` no matter the type of inheritance! */
    ptr->place_at(1, 2);

    delete ptr;

    return 0;
}

和继承之间似乎没有区别; 被要求两者兼而有之。有人可以解释一下我发生了什么事吗?我一定错过了什么。publicprivateBox::place_at(1, 2)publicprivate

C++ 继承重 抽象类

评论

0赞 Thomas Matthews 10/13/2023
您的方法应该是 或将结构更改为 a 而不是 .a 的默认可访问性是 contents。我建议解决这个问题并调高警告和错误级别(以最大报告)。place_at()publicstructclassclassprivate
0赞 Thomas Matthews 10/13/2023
将方法赋值为 0 会生成 or 抽象。例如classstructvirtual bool is_at(int x, int y) const = 0;
0赞 Christopher Miller 10/13/2023
@ThomasMatthews 关于你的第一条评论,那是我的错误;我改为 for both 和 .关于您的第二条评论,我从未听说过 - 那么这会强制所有派生类覆盖吗?classstructPlaceableBoxis_at
2赞 konchy 10/13/2023
struct Box : Placeable默认情况下,不是public inheritanceprivate
2赞 Pete Becker 10/13/2023
使用私有继承将失败,因为无法访问基。Placeable *ptr = new Box;

答: 暂无答案