我创建了一个具有一个受保护的方法的基类,该方法返回对象的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();
}

最佳答案

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

07-24 09:45
查看更多