程序小白天天打卡(关于多继承和虚继承)

本文通过具体的代码示例介绍了C++中的多继承和虚继承的概念。详细解释了多继承如何解决复杂对象关系问题,并演示了虚继承如何避免基类的多次拷贝导致的空间浪费和二义性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2018/2/8

C++

1.关于面向对象的简单见解

 面向对象就是把一个大的问题渐渐抽象成一个个小的对象,通过对一个个对象属性和方法的定义,描述,实现而解决一个大的问题

2.关于多继承(multiple inheritance)

 1.当对象中的关系比较复杂的时候使用多继承,比如说:A是基类,B和C是A的子类,但是D是B和C的综合,所以这个时候使用单继承的方法

不适用,因而采用多继承的方法

2.多继承语法

class A:public B,public C//说明A继承了B和C的方法,也说明了A是B和C的综合体*/

/*多继承
1.语法:class A:public B,public C//说明A继承了B和C的方法,也说明了A是B和C的综合体*/
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<string>
/*创造基类*/
/*名字,睡觉,吃*/
class Animal
{
public:

	string name;
	void sleep();
	void eat();
};
void Animal::sleep()
{
	cout << "今天我睡了8个小时,真爽!!\n";
}
void Animal::eat()
{
	cout << "我中午吃了红烧排骨\n";
}


/*子类之一:猪类*/
class pig :public  Animal/*继承代码:class subclass:class superclass{。。。。。。};*/
{
public:

	void climbing();//话说 猪会爬树嘛?
};
void pig::climbing()
{
	cout << "母猪会上树\n" << endl;

}
class turtle :public Animal/*继承*/
{
public:

	void swimming();
};
void turtle::swimming()
{
	cout << "总有一天我会超越孙杨\n" << endl;

}
class stranger :public pig, public turtle
{
public:
	void intronduce();
};
void stranger::intronduce()
{
	cout << "实现多继承是指处理复杂的关系时,相当于不能用一个‘是’来解决的问题" << endl;
}
void main()
{
	/*实例化对象*/
	pig pig1;
	turtle turtle1;
	stranger stranger1;
	cout << "***************************************************************" << endl;
	cout << "猪类\n";
	pig1.name = "八戒";


	pig1.eat();
	pig1.sleep();
	pig1.climbing();
	cout << "***************************************************************" << endl;
	cout << "龟类\n";


	turtle1.eat();
	turtle1.sleep();
	turtle1.swimming();
	cout << "******************************************************************" << endl;
	cout << "多继承类" << endl;
	stranger1.climbing();
	stranger1.swimming();
	stranger1.intronduce();
	cout << "*******************************************************************" << endl;

	system("pause");

}


2.虚继承(以下概念转载)

虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类有基类的拷贝)中的基类对象的地址,但是多重继承可能存在一个基类的多份拷贝,这就出现了二义性;所以采用虚继承的方式;

实现代码


#include<iostream>
using namespace std;
#include<stdlib.h>
#include<string>
/*创造基类*/
/*名字,睡觉,吃*/
class Animal
{
public:

	string name;
	void sleep();
	void eat();
	void eyes();
};
void Animal::sleep()
{
	cout << "今天我睡了8个小时,真爽!!\n";
}
void Animal::eat()
{
	cout << "我中午吃了红烧排骨\n";
}
void Animal::eyes()
{
	cout << "我有两只大眼睛" << endl;
}


/*子类之一:猪类*/
class pig :virtual public  Animal/*继承代码:class subclass:class superclass{。。。。。。};*/
{
public:

	void climbing();//话说 猪会爬树嘛?
};
void pig::climbing()
{
	cout << "母猪会上树\n" << endl;

}
class turtle :virtual public Animal/*虚继承*/
{
public:

	void swimming();
};
void turtle::swimming()
{
	cout << "总有一天我会超越孙杨\n" << endl;

}
class stranger :public pig,  public turtle
{
public:
	void intronduce();
};
void stranger::intronduce()
{
	cout << "实现多继承是指处理复杂的关系时,相当于不能用一个‘是’来解决的问题" << endl;
}
void main()
{
	/*实例化对象*/
	pig pig1;
	turtle turtle1;
	stranger stranger1;
	cout << "***************************************************************" << endl;
	cout << "猪类\n";
	pig1.name = "八戒";


	pig1.eat();
	pig1.sleep();
	pig1.climbing();
	pig1.eyes();
	cout << "***************************************************************" << endl;
	cout << "龟类\n";


	turtle1.eat();
	turtle1.sleep();
	turtle1.swimming();
	turtle1.eyes();
	cout << "******************************************************************" << endl;
	cout << "多继承类" << endl;
	stranger1.climbing();
	stranger1.swimming();
	stranger1.intronduce();
	stranger1.eyes();//采用虚继承的方式,防止子类进行多次拷贝
	
	cout << "*******************************************************************" << endl;

	system("pause");

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值