如何解决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 举报,一经查实,本站将立刻删除。