C++多继承时两个父类存在独立同名成员的访问歧义如何解决?
问题1:对moving的访问是否存在歧义?
是的,存在明确歧义。你当前采用的是非虚多继承,Arm类对象内部会存在两个完全独立的ServoPart子对象:一个由Major继承而来,一个由Minor继承而来,二者各持有一套独立的moving和servo成员。你直接写moving = false时,编译器无法判断你要修改哪个父类路径下的moving成员,实际编译阶段会直接报错,Intellisense的提示没有区分两路继承路径,属于提示不全。
另外额外提醒:当前moving是ServoPart的私有成员,即便你指定了继承路径,派生类Arm也没有权限直接访问基类的私有成员,这是你要解决的第二个问题。
问题2:如何修复?
分两步处理:
- 调整基类的访问权限/增加接口,保证派生类可以合法修改
moving,更推荐用接口的方式保证封装性:
class ServoPart { protected: virtual void doJob(byte* job) = 0; // 新增protected接口用于修改moving void setMoving(bool val) { moving = val; } private: bool moving; Servo servo; };
- 访问时明确指定继承路径,区分你要修改的是哪一路的
moving:
// 如果要修改Major路径下的moving Major::setMoving(false); // 如果要修改Minor路径下的moving Minor::setMoving(false); // 两个都要修改就同时写两行
问题3:不能用虚继承的假设是否正确?
完全正确。虚继承的核心作用就是让多路继承的多个派生类,共享同一个基类子对象。如果用虚继承继承ServoPart,你的Major和Minor会共用同一个ServoPart实例,自然也就共用同一个servo成员,完全不符合你需要两个独立Servo实例的需求,所以确实不能使用虚继承。
内容的提问来源于stack exchange,提问作者matthesinator
相关产品推荐
相关产品推荐

