📄 test.cpp
字号:
#include <iostream>
#include <string>
using namespace std;
class employee{
protected:
char * name;
short age;
float salary;
public: employee()
{ name=0; age=0; salary=0.0; }
employee(char * name1,short age1,float salary1)
{
name=new char[::strlen(name1)+1];
::strcpy(name,name1);
age=age1;
salary=salary1;
}
virtual void print()//这就是"虚函数",通知编译器该函数在子类中会有不同的实现。
{
cout<<"I am a employee."<<endl;
cout<<"name:"<<name;
cout<<"age:"<<age;
cout<<"salary:"<<salary<<endl; }
~employee()
{ delete[] name; }
virtual float Salary() //计算薪水
{
salary=(double)2000.50;
return salary;
}
void set(char * name1,short age1,float salary1)
{
delete name;
name = new char[::strlen(name1)+1];
::strcpy(name,name1);
age = age1;
salary = salary1;
}
};
class manager:public employee
{
private:
int level;
public:
manager(int level1=0)
{
level = level1;
}
manager(char * name1,short age1,float salary1,int level1):employee(name1,age1,salary1)
{
level=level1;
}
virtual void print()//一旦在基类中声明了虚函数,则在派生类中声明的具有同样函数名、同样返回值类型和相同的参数的函数自动成了"虚函数"。
{
cout<<"I am a manager!"<<endl;
cout<<"name:"<<name;
cout<<"age:"<<age;
cout<<"salary:"<<salary<<endl;
cout<<"level:"<<level<<endl;
}
virtual float Salary()//计算薪水
{
salary=(double)3000.50;
return salary;
}
void set(char * name1,short age1,float salary1,int level1)
{
employee::set(name1,age1,salary1);
level = level1;
}
};
void main()
{
char na[10];
short int nl;
double gz;
int jb;
employee* p[1000];
for(int i=0;i<1000;i++)
{
cout << endl;
cout << "请输入第" << i << "个员工的数据(姓名 年龄 工资 ):";
cin >> na >> nl >> gz;
cout << "行政级别(0为普通雇员):";
cin >> jb;
if(jb==0){
p[i] = new employee;
p[i]->set(na,nl,gz);
}
else{
manager* temp = new manager;
temp->set(na,nl,gz,jb);
p[i] = temp;
delete temp;
}
}
for(int j=0;j<1000;j++)
p[i]->print(); //在编译阶段,编译器并不按照它(p[i])的静态类型,确定此函数print()的版本。而是在运行时,根据p[i]具体所指对象的类型,找到相应版本的print()函数入口地址。
manager m("wang",42,2000.50,3);
employee *pe=&m;
pe->print(); //动态束定,调用manager::print()
m.print(); //静态束定,调用manager::print()
employee e=*pe;
e.print(); //静态束定,调用employee::print()
employee& r=*pe;//引用相当于常量指针
r.print(); //动态束定,调用manager::print()
//必须使用基类指针或引用来调用虚函数,通过对象名字不能体现虚函数的特性。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -