C++如何让多重继承的两个父类共用同一基类属性且不修改原有类?
可行实现方案
你遇到的是C++多继承场景下的菱形继承问题,默认多继承模式下两个父类会各自携带一份Base类实例,因此会存在两个独立的a成员。在不修改三个上层类的前提下,你可以通过在Combined类中隐藏父类的add、sub方法,自定义实现让两个方法操作同一个值并同步两份a的数值即可达到要求。
实现代码
#include <iostream> class Base { public: int a; Base() : a(0) {}; }; class Inherited1 : public Base { public: void add() { a++; } }; class Inherited2 : public Base { public: void sub() { a--; } }; class Combined : public Inherited1, public Inherited2 { public: // 隐藏父类的add、sub方法,自定义实现 void add() { // 统一操作Inherited1携带的Base实例的a,同步更新Inherited2的a Inherited1::add(); Inherited2::a = Inherited1::a; } void sub() { // 统一操作同一个a,同步更新两份实例的数值 Inherited1::a--; Inherited2::a = Inherited1::a; } }; int main() { Combined obj; obj.add(); obj.add(); obj.sub(); std::cout << dynamic_cast<Inherited1*>(&obj)->a << ' '; // 输出1 std::cout << dynamic_cast<Inherited2*>(&obj)->a; // 输出1 return 0; }
补充说明
你仿写std::iostream遇到这个问题是很合理的,标准库的iostream本身继承自istream和ostream,而这两个类都虚继承自ios基类,天然就只会保留一份基类实例,不存在你遇到的重复成员问题。如果后续你可以调整上层类的定义,只需要把Inherited1和Inherited2的继承方式改为virtual public Base就可以从根源解决这个问题,不需要在子类额外同步数值。
内容的提问来源于stack exchange,提问作者fpekal
相关产品推荐
相关产品推荐

