无法通过指针或对象访问受保护的成员

时间:2016-01-10 16:32:56

标签: c++ class c++11 inheritance

我有2个班TrainingTesting,其中Training是基类,TestingTraining的派生类。

我有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;
}

这个函数基本上做的是计算test1Testing类的一个对象)中属于class1Training类的一个对象)的每个文档的概率。

所有Training类(基类)变量都是Protected,所有Training类函数都是Public

当我尝试运行test1.totalProb(class1, total);时,我收到错误Error C2248 'Training::_probCalc': cannot access protected member declared in class 'Training'。我无法解决这个问题。

2 个答案:

答案 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):

只能访问基类的受保护成员

  1. 由Base的成员和朋友
  2. 由从Base派生的任何类的成员和朋友(直到C ++ 17),但仅当对从Base(包括此)派生的类型的对象进行操作时