测试菱形继承问题:
void testXuJicheng() {// 反面教材。一个基类被中间俩个派生类继承,最终的子类同时继承这俩个中间派生类,形成的类继承关系图像是菱形结构。// 菱形继承导致二义性与数据冗余问题。class Biology {public:string name;};class Bird : public Biology {};class Man: public Biology {};// 假设有一种生物BirdMan同时继承Bird和Manclass BirdMan : public Bird, public Man {}; BirdMan b;b.name = "birdMain";
}
可以看到编译错误:BirdMan::name不明确。
原因是,成员变量name从俩个父类中继承到,这里不知道是指的哪个。
代码修改为:
void testXuJicheng() {class Biology {public:string name;};class Bird : virtual public Biology {}; // 虚继承class Man: virtual public Biology {}; // 虚继承// 假设有一种生物BirdMan同时继承Bird和Manclass BirdMan : public Bird, public Man {}; BirdMan b;b.name = "安德森";cout << "a BirdMan, name: " << b.name << endl;
}
打印:
ok.