vitual 函数

虚函数:通过基类对象指针指向派生类对象,或通过基类对象引用来引用派生类对象


#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::cin;
using std::string;

class ex0{
public:
virtual string show(){
return "0号异常";;
}
};
class ex1 : public ex0
{
public:
string show()
{
return "1号异常";
}
};
class ex2 : public ex0
{
public:
string show()
{
return "2号异常";
}
};
class ex3 : public ex0
{
public:
string show()
{
return "3号异常";
}
};
int main()
{
ex1 a;
ex2 b;
ex3 c;
cout<<"请输入一个异常编号:"<<endl;
int n;
cin>>n;
try
{
switch(n)
{
case 1: throw a;
case 2: throw b;
case 3: throw c;
default: cout<<"输入的数不在范围之内."<<endl;
}
}
catch(ex0 & e)
{
cout<<"在main函数中捕获了"<<e.show()<<endl;
}
// catch(ex2 e )
// {
// cout<<"在main函数中捕获了"<<e.show()<<endl;
// }
// catch(ex3 e)
// {
// cout<<"在main函数中捕获了"<<e.show()<<endl;
// }
return 0;
}





#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(string i="10000",string na="noname",int a=0,char s='M') //Person类构造函数
{
id = i;
name = na;
age = a;
sex = s;
}
void SetData(string i="10000",string na="noname",int a=0,char s='M') //修改信息
{
id = i;
name = na;
age = a;
sex = s;
}
virtual void ShowInfo( ) //定义虚函数
{
cout<<endl;
cout<<"Id: "<<id<<endl;
cout<<"name: "<<name<<endl;
cout<<"age: "<<age<<endl;
cout<<"sex: "<< (sex=='M'?"Man":"Woman") <<endl;
}
protected:
string id;
string name;
int age;
char sex;
}; //End of Person
class UnderGraduate:virtual public Person
{
public:
UnderGraduate(string i,string na,int a,char s,string ma,float sc) //构造函数
:Person(i,na,a,s) //初始化列表
{
major = ma;
score = sc;
}
void SetData(string i,string na,int a,char s,string ma,float sc) //修改信息
{
Person::SetData(i,na,a,s);
major = ma;
score = sc;
}
void ShowInfo() //显示信息
{
cout<<endl;
Person::ShowInfo();
cout<<"major: "<<major<<endl;
cout<<"score: "<<score<<endl;
}
protected:
string major;
float score;
}; //End of UnderGraduate
class Teacher: virtual public Person
{
public:
Teacher(string i,string na,int a,char s,float sa) //Teacher类构造函数
:Person(i,na,a,s),salary(sa)
{
}
void SetData(string i,string na,int a,char s,float sa)
{
Person::SetData(i,na,a,s);
salary = sa;
}
void ShowInfo()
{
Person::ShowInfo();
cout<<"salary: "<<salary<<endl;
}
protected:
float salary;
}; //End of Teacher
class Graduate:public UnderGraduate, public Teacher // 从两个类继承
{
public:
Graduate(string i,string na,int a,char s,string ma,float sc,float sa)
:UnderGraduate(i,na,a,s,ma,sc),Teacher(i,na,a,s,sa),Person(i,na,a,s)
{
}
void SetData(string i,string na,int a,char s,string ma,float sc,float sa)
{ //修改信息
Person::SetData(i,na,a,s);
major = ma;
score = sc;
salary = sa;
}
void ShowInfo() //显示信息
{
cout<<endl;
cout<<"Id: "<<id<<endl;
cout<<"name: "<<name<<endl;
cout<<"age: "<<age<<endl;
cout<<"sex: "<< (sex=='M'?"Man":"Woman") <<endl;
cout<<"major: "<<major<<endl;
cout<<"score: "<<score<<endl;
cout<<"salary:"<<salary<<endl;
}
}; //End of Graduate
int main()
{
Person * personPtr; //定义基类Person的指针
Person ObjectP("201302034","ZhangNing",21,'W');
personPtr = &ObjectP; //基类的指针指向基类Person的对象
personPtr->ShowInfo();
UnderGraduate ObjectUG("201302034","ZhangNing",21,'W',"Computer",98.5);
personPtr = &ObjectUG; //基类的指针指向派生类UnderGraduate的对象
personPtr->ShowInfo();
Teacher ObjectT("201302034","ZhangNing",21,'W',1800);
personPtr = &ObjectT; //基类的指针指向派生类Teacher的对象
personPtr->ShowInfo();
Graduate ObjectG("201302034","ZhangNing",21,'W',"Computer",98.5,1800);
personPtr = &ObjectG; //基类的指针指向派生类Graduate的对象
personPtr->ShowInfo();
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值