⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.cpp

📁 ThinkingC++中文版
💻 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 + -