测试代码:
#include <iostream>
using namespace std;
class B
{
public:
virtual void FunTest1()
{
cout<<"B::FunTest1()"<<endl;
}
int _b;
};
class C1:public B
{
public:
virtual void FunTest1()
{
cout<<"C1::FunTest1()"<<endl;
}
virtual void FunTest2()
{
cout<<"C1::FunTest2()"<<endl;
}
int _c1;
};
class C2:public B
{
public:
virtual void FunTest1()
{
cout<<"C2::FunTest1()"<<endl;
}
virtual void FunTest3()
{
cout<<"C2::FunTest3()"<<endl;
}
int _c2;
};
class D:public C1,public C2
{
public:
virtual void FunTest1()
{
cout<<"D::FunTest1()"<<endl;
}
virtual void FunTest2()
{
cout<<"D::FunTest2()"<<endl;
}
virtual void FunTest3()
{
cout<<"D::FunTest3()"<<endl;
}
virtual void FunTest4()
{
cout<<"D::FunTest4()"<<endl;
}
int _d;
};
void Fun()
{
C1 c1;
c1._b=1;
c1._c1=2;
c1.FunTest1();
c1.FunTest2();
C2 c2;
c2._b=3;
c2._c2=4;
c2.FunTest1();
c2.FunTest3();
D d;
d._d=40;
d._b=10;
d._c1=20;
d._c2=30;
d.FunTest1();
d.FunTest2();
d.FunTest3();
d.FunTest4();
}
int main()
{
Fun();
return 0;
}
上面的程序编译时会报错。
是因为D类继承C1,C2,而C1,C2又分别继承B类,所以C1,C2各继承一个_b.
那么,问题来了,D类的对象d直接调用_b时,是C1中的_b呢,还是C2中的_b呢。所以会产生奇异。
正确的调用方法如下:(只修改Fun()函数,其他不变)
void Fun()
{
C1 c1;
c1._b=1;
c1._c1=2;
c1.FunTest1();
c1.FunTest2();
C2 c2;
c2._b=3;
c2._c2=4;
c2.FunTest1();
c2.FunTest3();
D d;
d._d=40;
d.C1::_b=10;//调用c1中的_b
d.C2::_b=100;//调用c2中的_b
d._c1=20;
d._c2=30;
d.FunTest1();
d.FunTest2();
d.FunTest3();
d.FunTest4();
}
具体分析如下:
介绍下虚拟继承:
测试代码:
class B
{
public:
virtual void FunTest1()
{}
int _b;
};
class D:virtual public B
{
public:
virtual void FunTest1()
{}
virtual void FunTest2()
{}
int _d;
};
void Fun()
{
B b;
b._b=10;
b.FunTest1();
D d;
d._b=20;
d._d=100;
d.FunTest1();
d.FunTest2();
}
int main()
{
Fun();
return 0;
}
分析如下:
那么,虚拟继承下的菱形继承又是什么样的呢?
测试代码如下:
class B
{
public:
virtual void FunTest1()
{
cout<<"B::FunTest1()"<<endl;
}
int _b;
};
class C1:virtual public B
{
public:
virtual void FunTest1()
{
cout<<"C1::FunTest1()"<<endl;
}
virtual void FunTest2()
{
cout<<"C1::FunTest2()"<<endl;
}
int _c1;
};
class C2:virtual public B
{
public:
virtual void FunTest1()
{
cout<<"C2::FunTest1()"<<endl;
}
virtual void FunTest3()
{
cout<<"C2::FunTest3()"<<endl;
}
int _c2;
};
class D: public C1, public C2
{
public:
virtual void FunTest1()
{
cout<<"D::FunTest1()"<<endl;
}
virtual void FunTest2()
{
cout<<"D::FunTest2()"<<endl;
}
virtual void FunTest3()
{
cout<<"D::FunTest3()"<<endl;
}
virtual void FunTest4()
{
cout<<"D::FunTest4()"<<endl;
}
int _d;
};
void Fun()
{
C1 c1;
c1._b=1;
c1._c1=2;
c1.FunTest1();
c1.FunTest2();
C2 c2;
c2._b=3;
c2._c2=4;
c2.FunTest1();
c2.FunTest3();
D d;
d._d=40;
d._b=10;
d._c1=20;
d._c2=30;
d.FunTest1();
d.FunTest2();
d.FunTest3();
d.FunTest4();
}
int main()
{
Fun();
return 0;
}
分析如下: