我有2个班Training
和Testing
,其中Training
是基类,Testing
是Training
的派生类。
我有Testing
类成员函数float totalProb(Training& classProb, Training& total)
,它有2个参数,都是Training
类对象。代码:
void Testing::totalProb(Training& classProb, Training& total) {
_prob = (_prob * ((float)(classProb._nOfClass) / total._tnClass));
cout << "The probalility of the " << it->first << " beloning to " << classProb._classType << " is: " << _prob << endl;
}
这个函数基本上做的是计算test1
(Testing
类的一个对象)中属于class1
(Training
类的一个对象)的每个文档的概率。
所有Training
类(基类)变量都是Protected
,所有Training
类函数都是Public
。
当我尝试运行test1.totalProb(class1, total);
时,我收到错误Error C2248 'Training::_probCalc': cannot access protected member declared in class 'Training'
。我无法解决这个问题。
答案 0 :(得分:3)
您正在尝试访问您母班的其他实例的成员:
classProb
,但继承使您只能访问自己父类的受保护成员。
纠正的一种方法(但很大程度上取决于你要做的事情)是在训练课中放置一个_probClass
的getter并在测试中调用它,例如对于_probCalc成员: / p>
public:
(Type) Training::getProbCalc() {
return _probCalc;
}
要在循环中更改您的电话:
for (it3 = classProb.getProbCalc().begin(); it3 != classProb.getProbCalc().end(); it3++)
如果您尝试访问由您的母实例继承的您自己的成员,请直接调用它们。例如:
for (it3 = _probCalc().begin(); it3 != _probCalc().end(); it3++)
答案 1 :(得分:0)
请考虑以下您可能创建的最小示例:
class Base
{
public:
Base(int x = 0)
:m_x(x)
{}
protected:
int m_x;
};
class Derived : public Base
{
public:
Derived(Derived& der)
{
this->m_x = 1; // works
Base base;
// int i = base.m_x; // will not work
Derived works(base);
int i = works.m_x; // also works
}
Derived(Base& base)
: Base(base) // Base(base.m_x) will not work
{
}
};
cpp参考在受保护的成员访问权限一章中说明了以下(https://en.cppreference.com/w/cpp/language/access):
只能访问基类的受保护成员