微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++ 虚拟继承和对公共虚拟方法的访问,该方法的实现在继承受保护的类中

如何解决C++ 虚拟继承和对公共虚拟方法的访问,该方法的实现在继承受保护的类中

我正在使用虚拟继承创建一个类 EditablePrimeNumberSet(一组素数),该类继承了类 EditableNumberSet(一组可以递增的整数),同时只公开基类 NumberSet(一组数字)。 (我不希望我的班级公开 add 方法,这将导致一个不只包含素数的集合)

备注:这只是一个简单的例子。我实际上不研究质数。这个例子只是为了说明我面临的问题。

我的问题是,当我想在 EditableNumberSet 变量上调用虚拟方法 contains44 时,我需要对其进行 static_cast 以避免编译错误。看起来编译器发现直接实现是易于处理的,因为它知道我的对象的实际类型,但随后发现此方法不可访问。所以,实际上,我并没有被卡住,而是觉得做这样的 static_cast 既好奇又不优雅。是否有一些技巧可以改进我的代码

using namespace std;

class NumberSet {
public :
    int size() {return myList.size();}
    virtual bool contains44()
    {
      cout << "in base method\n";
      return myList.count(44)>0;
    };
protected :
    set<int> myList;
};

class EditableNumberSet : public virtual NumberSet {
public :
    void add(int i) {myList.insert(i);}
    bool contains44() override
    {
        cout << "in inherited method\n";
        return false;
    } // 44 is not a prime number
};

class EditablePrimeNumberSet: public virtual NumberSet,protected EditableNumberSet {
public :
    void addNearestPrimeNumber(int i)
    {
        int j=0;
        //code that set j to the nearest prime number next to i...
        add(j);
    }
};

int main()
{
    EditablePrimeNumberSet listPN;
    listPN.addNearestPrimeNumber(45);
    listPN.NumberSet::contains44(); //  use base class method implementation
    static_cast<NumberSet &>(listPN).contains44(); // use derived class method implementation
    listPN.contains44(); //  error: ‘virtual bool EditableNumberSet::contains44()’ is inaccessible within this context
}

解决方法

如果要从受保护的类中公开单个名称,可以使用 using 声明:

class EditablePrimeNumberSet : public virtual NumberSet,protected EditableNumberSet {
public:
    using EditableNumberSet::contains44; // Expose EditableNumberSet::contains44 as 
                                         // part of EditablePrimeNumberSet's public interface

    void addNearestPrimeNumber(int i)
    {
        int j = 0;
        //code that set j to the nearest prime number next to i...
        add(j);
    }
};

然后当您调用 listPN.contains44() 时,您将调用继承的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。