受保护的成员不能通过指针或对象访问。

9

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

我有一个 Testing 类的成员函数,float totalProb(Training& classProb, Training& total),它接受两个参数,都是 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的,所有函数都是Public的。当我尝试运行test1.totalProb(class1, total)时,出现错误 "Error C2248 'Training::_probCalc': cannot access protected member declared in class 'Training'",我无法解决这个问题。

1
请提供一个更简单的代码示例 - 目前存在许多无关的内容,这些内容遮盖了您问题的实质。 - Oliver Charlesworth
@OliverCharlesworth 我让代码更简单了。 - nSv23
不要使用 C 风格的强制类型转换。 - Guillaume Racicot
2个回答

5
您正在尝试访问您母类的另一个实例的成员:classProb,但是继承只允许您访问自己父类的受保护成员。
纠正方法之一(但它强烈依赖于您想要做什么)是在您的Training类中放置_probClass的getter,并在测试中调用它,例如对于_probCalc成员。
public:
  (Type) Training::getProbCalc() {
    return _probCalc;
  }

在循环中更改调用的方法:

for (it3 = classProb.getProbCalc().begin(); it3 != classProb.getProbCalc().end(); it3++)

如果您想访问由您母亲实例继承的自己的成员,只需直接调用它们即可。例如:
for (it3 = _probCalc().begin(); it3 != _probCalc().end(); it3++)

9
好的,我会尝试使用 getter 函数并告诉你结果。但是我不明白为什么“派生类”不能调用“基类”的“protected”变量?我已经阅读过相关资料,但仍然无法理解。 但是继承只能让你访问自己父类的受保护成员。 TrainingTesting 的父类。 - nSv23

4
请考虑您可以创建的以下最小示例:
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):
类Base的受保护成员只能被以下对象访问:
  1. Base的成员和友元
  2. (直到C++17)任何从Base派生的类的成员和友元,但是仅当操作的对象是从Base派生的类型(包括this)时才能够访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接