《C++从入门到精通》实例--多态与重载

           《C++从入门到精通》实例--多态与重载

 

//范例1:虚函数
//知识点:虚函数
//2018.3.26

#include <iostream>
#include <string>
using namespace std;           //using指令,全局范围内声明的
class CBuilding
{
	//定义建筑类
	string name;              //定义名称
public:
	void set(string strName);  //修改名称
	virtual void display()     //显示信息,声明为虚函数
	{
		cout << "建筑是" << name << "\n";
	}
};                             //建筑类定义完毕

void CBuilding::set(string strName)
{
	//修改名称方法的实现
	name = strName;
}
class CBridge :public CBuilding
{
	//通过继承来定义桥类
	float length;             //定义长度
public:
	void setLength(float l = 0.0){ length = l; }  //设置长度
	void display()
	{
		CBuilding::display();   //调用基类方法显示名称
		cout << "其长度是" << length << "米。\n";    //显示长度信息
	}
};                              //桥类定义完毕

void show(CBuilding *b)
{
	//通过指向基类指针进行显示
	b->display();
	return;
}

int main(int argc, char* argv[])
{
	CBuilding building;              //创建建筑对象
	CBridge bridge;                  //创建桥对象
	building.set("中国古代建筑");   //设置名称
	show(&building);                //显示信息
	bridge.set("中国赵州桥");       //设置桥的名称
	bridge.setLength(static_cast<float>(60.40));  //修改桥的长度
	show(&bridge);                  //显示桥的信息
	system("pause");
	return 0;
}

//范例2:通过构造函数完善范例1
//知识点:构造函数
//2018.3.26

#include <iostream>
#include <string>
using namespace std;                                                //using指令,全局范围内声明的
class CBuilding
{
	//定义建筑类
	string name;                                                    //定义名称
public:
	CBuilding(string strName = "CBuilding"){ name = strName; }      //构造函数
	void set(string strName);                                       //修改名称
	virtual void display()                                          //显示信息,声明为虚函数
	{
		cout << "建筑是" << name << "\n";
	}
};                                                                  //建筑类定义完毕

void CBuilding::set(string strName)
{
	//修改名称方法的实现
	name = strName;
}
class CBridge :public CBuilding
{
	//通过继承来定义桥类
	float length;                                                   //定义长度
public:
	CBridge(string strName = "CBuilding", float l = 0.0) :CBuilding(strName), length(l){}
	void setLength(float l = 0.0){ length = l; }                    //设置长度
	void display()
	{
		CBuilding::display();                                      //调用基类方法显示名称
		cout << "其长度是" << length << "米。\n";                  //显示长度信息
	}
};                                                                 //桥类定义完毕

void show(CBuilding *b)
{
	//通过指向基类指针进行显示
	b->display();
	return;
}

int main(int argc, char* argv[])
{
	CBuilding building("中国古代建筑");                           //创建建筑对象
	CBridge bridge("中国赵州桥",60.4F);                           //创建桥对象
	show(&building);                                              //显示信息
	show(&bridge);                                                //显示桥的信息
	system("pause");
	return 0;
}

//范例3:交通工具的衍生--抽象类的使用
//知识点:抽象类
//2018.3.26

#include <iostream>
#include <string>
using namespace std;                                                //using指令,全局范围内声明的

class Vehicle
{
	//定义Vehicle抽象类
	string name;                                             //定义名称
public:
	Vehicle(string theName = "Vehicle"){ name = theName; }  //构造函数
	string GetName(){ return name; }                        //获得名称信息
	virtual void Motion(string Model = "Motion") = 0;       //定义纯虚函数
};
class Car :public Vehicle
{
	//派生Car类
public:
	Car(string theName = "Car") :Vehicle(theName){}         //向基类传递信息
	virtual void Motion(string Model = "Motion"){ cout << GetName() << "--" << "Robotization" << endl; }//覆盖纯虚函数
};
int main(int argc, char* argv[])
{
	//Vehicle vehicle();   //错误,抽象类不能实例化
	Car car("Jeep");       //创建汽车对象
	car.Motion();          //调用虚函数
	system("pause");
	return 0;
}

//范例4:利用函数重载实现一个简单的加法器
//知识点:函数重载
//2018.3.26

#include <iostream>
#include <string>
using namespace std;

class Summator
{
	//加法器
public:
	int Addition(int a, int b);          //实现两个整数的相加
	float Addition(float a, float b);    //实现两个小数的相加
	string Addition(string a, string b); //实现两个字符串的相加
};
int Summator::Addition(int a, int b)
{
	return a + b;
}
float Summator::Addition(float a, float b)
{
	return a + b;
}
string Summator::Addition(string a, string b)
{
	return a + b;
}
int main(int argc, char* argv[])
{
	Summator summator;                                                             //创建加法器对象
	int intA, intB;                                                                //定义两个整数
	float floatA, floatB;                                                          //定义两个小数
	string stringA, stringB;                                                       //定义两个字符串
	cout << "请输入两个整数:" << endl;                                             //提示输入
	cin >> intA >> intB;                                                           //输入整数
	cout << intA << "+" << intB << "=" << summator.Addition(intA, intB) << endl;   //利用重载函数求整数的相加
	cout << "请输入两个小数:" << endl;    
	cin >> floatA >> floatB;
	cout << floatA << "+" << floatB << "=" << summator.Addition(floatA, floatB) << endl;
	cout << "请输入两个字符串:" << endl;
	cin >> stringA >> stringB;
	cout << stringA << "+" << stringB << "=" << summator.Addition(stringA, stringB) << endl;
	system("pause");
	return 0;
}

//范例5:利用y运算符的重载实现可以计算复数的加法器
//知识点:运算符重载
//2018.3.26

#include <iostream>
#include <string>
using namespace std;

class Complex
{
	double a;    //定义实部
	double b;    //定义虚部
public:
	Complex() { a = 0; b = 0; }
	Complex operator +(Complex another)
	{
		//重载+运算符
		Complex add;
		add.a = a + another.a;
		add.b = b + another.b;
		return add;
	}
	void Putin()
	{
		//输入复数
		cin >> a >> b;
		return;
	}
	void Show()
	{
		//输出复数
		cout << "(" << a << "+" << b << "i)";
		return;
	}
};

class Summator
{
	//加法器
public:
	int Addition(int a, int b);          //实现两个整数的相加
	float Addition(float a, float b);    //实现两个小数的相加
	string Addition(string a, string b); //实现两个字符串的相加
	Complex Addition(Complex a, Complex b);  //实现两个复数的相加
};
int Summator::Addition(int a, int b)
{
	return a + b;
}
float Summator::Addition(float a, float b)
{
	return a + b;
}
string Summator::Addition(string a, string b)
{
	return a + b;
}
Complex Summator::Addition(Complex a, Complex b)
{
	return a + b;
}
int main(int argc, char* argv[])
{
	Summator summator;                                                             //创建加法器对象
	int intA, intB;                                                                //定义两个整数
	float floatA, floatB;                                                          //定义两个小数
	string stringA, stringB;                                                       //定义两个字符串
	Complex complexA, complexB;                                                    //定义两个复数
	cout << "请输入两个整数:" << endl;                                             //提示输入
	cin >> intA >> intB;                                                           //输入整数
	cout << intA << "+" << intB << "=" << summator.Addition(intA, intB) << endl;   //利用重载函数求整数的相加
	cout << "请输入两个小数:" << endl;    
	cin >> floatA >> floatB;
	cout << floatA << "+" << floatB << "=" << summator.Addition(floatA, floatB) << endl;
	cout << "请输入两个字符串:" << endl;
	cin >> stringA >> stringB;
	cout << stringA << "+" << stringB << "=" << summator.Addition(stringA, stringB) << endl;
	cout << "请输入两个复数:" << endl;
	complexA.Putin();
	complexB.Putin();
	complexA.Show();
	cout << "+";
	complexB.Show();
	cout << "=";
	summator.Addition(complexA, complexB).Show();
	cout << endl;
	system("pause");
	return 0;
}

//综合运用:利用抽象类文具类派生笔类,然后派生出钢笔类
//知识点:多态与重载
//2018.3.26

#include <iostream>
#include <string>
using namespace std;

class CStationery
{
	//定义抽象类文具类
private:
	string Name;       //属性名字
public:
	CStationery(string n) { Name = n; }   //构造函数
	virtual void Show() = 0;             //定义文具类成员函数Show为纯虚函数
	virtual void name(string n) = 0;     //定义文具类成员函数name为纯虚函数
};
class CWriteStationery :public CStationery
{
	//定义笔类,继承自文具类
private:
	string Name;                        //属性名字
public:
	CWriteStationery(string n) :CStationery(n) { Name = n; }  //向基类传递名称信息并初始化名称属性
	void Show() { cout << Name << endl; }                     //在这里实现了基类的Show方法
};
class CPen :public CWriteStationery
{
	//定义钢笔类,继承自笔类
private:
	string Name;                        //属性名字
public:
	CPen(string n) :CWriteStationery(n) { Name = n; }        //向基类传递名称信息并初始化名称属性
	void name(string n) { Name = n; }                        //在这里实现了基类的name方法
	void Show()
	{
	    //重载了基类的Show方法
		cout << Name << endl;
		return;
	}
	void Show(string m)
	{
	    //重载了基类的Show方法
		cout << m << Name << endl;
		return;
	}
};

int main(int argc, char* argv[])
{
    //CStationery stationery("文具");         //错误
	//CWriteStationery writestationery("笔");  //错误
	CPen pen("钢笔");                          //创建钢笔对象
	pen.Show();                                //显示信息
	pen.name("派克钢笔");                      //修改名字
	pen.Show("一支");                          //显示新的信息
	system("pause");
	return 0;
}

 

注意:

1.C++四种强制类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值