《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;
}
注意: