c++ --------- 多态下的菱形继承,菱形虚拟继承

                         

测试代码:

  

#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;

}
分析如下:








  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值