使从一个基类派生的类能够使用继承的受保护成员

时间:2018-04-17 03:56:04

标签: c++ inheritance virtual access

我创建了一个基类,其中一个protected方法返回了对象的id。我只希望派生类能够在其他派生类上查询此id,但是将其隐藏在继承层次结构之外的类中。

class Identifiable {
    public:
        virtual ~Identifiable() = default;
    protected:
        virtual auto getId() const noexcept -> unsigned = 0;
    };

    class ObjectA: public Identifiable {
    protected:
        auto getId() const noexcept -> unsigned override { return 0; }
    };

    class SpecificObjectA: public ObjectA {
    protected:
        using ObjectA::getId;
    };

    class ObjectB: Identifiable {
    public:
        explicit ObjectB(const SpecificObjectA& objectA) {
            objectA.getId(); // error C2248: 'SpecificObjectA::getId': cannot access protected member declared in class 'SpecificObjectA'
        }
    protected:
        auto getId() const noexcept -> unsigned override { return 0; }
};

除了添加下一个方法之外,有什么方法可以使它工作吗?

auto getId(const Identifiable& identifiable) const noexcept -> unsigned {
    return getId();
}

2 个答案:

答案 0 :(得分:1)

不,那是不可能的。否则,它将允许您通过创建从相关基类派生的另一个类来使用来自任何类的虚拟保护成员。

答案 1 :(得分:0)

您不能按预期执行,但您可以尝试这样做:

class Identifiable
{
public:
    virtual ~Identifiable() = default;
protected:
    virtual unsigned getId() const noexcept = 0;
    static unsigned int getId(Identifiable const& other)
    {
        return other.getId();
    }
};

现在你可以做到:

explicit ObjectB(const SpecificObjectA& objectA)
{
    Identifiable::getId(objectA);
}

我个人不会使用尾随返回类型,除非你真的need它,否则它只会降低可读性。