首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使从一个基类派生的类能够使用继承的受保护成员

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

Stack Overflow用户
提问于 2018-04-17 11:56:04
回答 2查看 41关注 0票数 0

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

代码语言:javascript
复制
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; }
};

除了添加next方法之外,还有什么方法可以让它工作吗?

代码语言:javascript
复制
auto getId(const Identifiable& identifiable) const noexcept -> unsigned {
    return getId();
}
EN

回答 2

Stack Overflow用户

发布于 2018-04-17 12:13:13

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

票数 1
EN

Stack Overflow用户

发布于 2018-04-17 13:01:49

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

代码语言:javascript
复制
class Identifiable
{
public:
    virtual ~Identifiable() = default;
protected:
    virtual unsigned getId() const noexcept = 0;
    static unsigned int getId(Identifiable const& other)
    {
        return other.getId();
    }
};

现在您可以执行以下操作:

代码语言:javascript
复制
explicit ObjectB(const SpecificObjectA& objectA)
{
    Identifiable::getId(objectA);
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49869663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档