C++ 使用父类中的受保护数据传递到子类

C++ 使用父类中的受保护数据传递到子类,c++,oop,class,inheritance,C++,Oop,Class,Inheritance,当传递到派生类时,如何访问父类中受保护的数据 class parent { protected: int a; }; class child : public parent { void addOne(parent * &); }; void child::addOne(parent * & parentClass) { parentClass->a += 1; } int main() { parent a;

当传递到派生类时,如何访问父类中受保护的数据

class parent
{ 
    protected:
        int a;
};

class child : public parent
{
    void addOne(parent * &);
};

void child::addOne(parent * & parentClass)
{
    parentClass->a += 1;
}

int main()
{
    parent a;
    child b;

    parent* ap = &a;

    b.addOne(ap);
}

无法通过基类的指针/引用访问受保护的数据。这是为了防止您破坏其他派生类对该数据可能具有的不变量

class parent
{
    void f();
    // let's pretend parent has these invariants:
    // after f(), a shall be 0
    // a shall never be < 0.

    protected:
        int a;
};

class child : public parent
{
public:
    void addOne(parent * &);
};


class stronger_child : public parent
{
public:
    stronger_child(int new_a) {
        if(new_a > 2) a = 0;
        else a = new_a;
    }
    // this class holds a stronger invariant on a: it's not greater than 2!
    // possible functions that depend on this invariant not depicted :)
};

void child::addOne(parent * & parentClass)
{
    // parentClass could be another sibling!
    parentClass->a += 1;
}

int main()
{
    stronger_child a(2);
    child b;

    parent* ap = &a;

    b.addOne(ap); // oops! breaks stronger_child's invariants!
}
类父类
{
无效f();
//让我们假设父对象具有以下不变量:
//f()之后,a应为0
//a不得小于0。
受保护的:
INTA;
};
类子:公共父类
{
公众:
void addOne(父*&);
};
子类:公共父类
{
公众:
更强壮的孩子(int new_a){
如果(新的_a>2)a=0;
else a=新的a;
}
//这个类在a上有一个更强的不变量:它不大于2!
//依赖于此不变量的可能函数未描述:)
};
void child::addOne(父类*&父类)
{
//parentClass可能是另一个兄弟姐妹!
父类->a+=1;
}
int main()
{
强子a(2);
儿童b;
父级*ap=&a;
b、 addOne(ap);//哎呀!破坏了孩子的不变量!
}

只是
a+=1
。基本成员成为类的一部分。请提供一个代码示例,该示例实际显示您正在尝试执行的操作,并且不包含任何不相关的错误(即
addOne(a)
不是有效的调用)。抱歉,已修复此问题。我要做的是从一个子类编辑父类中的二叉树。(声明了一个父类,声明了一个子类)。我的工作是在父级中使用一个包装器函数,将二叉树头指针传递给子级。谢谢!!我没有意识到我可以这样伤害其他孩子。我重新定义了我的算法,以便父类管理我需要的数据,即使这对父类来说意义不大。这比违反OO规则要好++Martinho@CornSmith请检查我的轻微编辑。我以前犯过一个错误。您不仅限于当前实例,还限于当前类型的指针/引用。类型知道自己的不变量,因此可以安全地操作该类型的其他实例(模错误)。例如,这在@R-Martinho-Fernandes中起作用,所以您的意思是一个子类可以编辑另一个子类的父类变量,如果它是相同的类型。谢谢你的提示!(ideone上的代码很好,超越了它)让我们希望
child
不会破坏
strong\u child
不变量。@curiousguy对不起,我不明白。你这是什么意思?这不是我在回答中所说的吗?