纯虚函数和抽象类

语法格式:

virtual 返回值类型 函数名 (函数参数) = 0;

 

含有纯虚函数的类为抽象类。

 

注意点:

抽象类不能常见对象:因为纯虚数没有函数体,不是完整的函数,无法调用,因此无法实例化。

抽象函数一般用来作为基类,让派生类去实现虚函数。

 

在这个抽象类中,如果有其他不是虚函数的成员函数,那么只要定义一个基类指针指向派生类,就可以直接调用这些正常的成员函数。

抽象类与虚函数的说明:

1) 一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。

2) 只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数均不能声明为纯虚函数。

多态实例代码:

 

//主程序
#include <iostream>
#include <string>
using namespace std;

#include "allclass.h"
int main()
{
	Employee *p[4];
	cout << "小时工" << endl;
	p[0] = new Technician();
	cout << p[0]->getname() << " 工号:" << p[0]->getnum() << " 薪水:" << p[0]->getsalary() << endl;
	cout << "销售人员:" << endl;
	p[1] = new Salesman();
	cout << p[1]->getname() << " 工号:" << p[1]->getnum() << " 薪水:" << p[1]->getsalary() << endl;
	cout << "管理员:" << endl;
	p[2] = new Manager();
	cout << p[2]->getname() << " 工号:" << p[2]->getnum() << " 薪水:" << p[2]->getsalary() << endl;
	cout << "销售经理" << endl;
	p[3] = new SaleManger();
	cout << p[3]->getname() << " 工号:" << p[3]->getnum() << " 薪水:" << p[3]->getsalary() << endl;



	system("pause");
}

//.h头文件
#include <iostream>
using namespace std;

class Employee 
{
public:
	 Employee();
	 virtual void setname();
	 virtual void setnum();
     virtual  string getname();
	 virtual string  getnum();
	 virtual double getsalary();
protected:
	string m_name;
	string m_num;
	double m_salary;
};

class Technician : public Employee
{
public:
	Technician();
	void SetWorkTime();
	void  SetWorkSalary();
	double getsalary();
private:
	double m_WorkTime;
	double m_WorkSalary;
};

class Salesman :public Employee
{
public :
	Salesman();
	virtual void SetSalePri();
	virtual void SetSalePro();
	double getsalary();
protected:
	double m_SalePri;
	double m_SalePro;
};

class Manager :public Employee
{
public:
	Manager();
	void SetFixSalary();
	double getsalary();
protected:
	double m_FixSalary;
};

class SaleManger : public Salesman
{
public:
	SaleManger();
	void SetFixSalary();
	double getsalary();
protected:
	double m_FixSalary;
};

//.cpp文件
#include "allclass.h"
#include<string>

Employee::Employee()
{
	setname();
	setnum();
}

string Employee::getname(){ return m_name; }

string Employee::getnum(){ return m_num; }

double Employee::getsalary(){ return m_salary; }


void Employee::setname()
{
	string name;
	cout << "输入姓名" << endl;
	getline(cin, name);
	m_name = name;
}

void Employee::setnum()
{
	string num;
	cout << "输入工号" << endl;
	getline(cin, num);
	m_num = num;
}

void Technician::SetWorkSalary()
{
	int salary;
	cout << "输入时薪" << endl;
	cin >> salary;
	m_WorkSalary= salary;
}

void Technician::SetWorkTime()
{
	int worktime;
	cout << "输入时长" << endl;
	cin >> worktime;
	m_WorkTime = worktime;
}

Technician::Technician()
{
	SetWorkSalary();
	SetWorkTime();
	cin.get();
}

double Technician::getsalary()
{
	m_salary = m_WorkTime*m_WorkSalary;
	return m_salary;
}

Salesman::Salesman()
{
	SetSalePri();
	SetSalePro();
	cin.get();
}

void Salesman::SetSalePri()
{
	cout << "输入销售额" << endl;
	cin >> m_SalePri;
}

void Salesman::SetSalePro()
{
	cout << "输入销售比例" << endl;
	cin >>m_SalePro;
}

double Salesman::getsalary()
{
	m_salary = m_SalePro*m_SalePri;
	return m_salary;
}

Manager::Manager()
{
	SetFixSalary();
	cin.get();
}

void Manager::SetFixSalary()
{
	cout << "固定薪资" << endl;
	cin >> m_FixSalary;
}

double Manager::getsalary()
{
	m_salary = m_FixSalary;
	return m_salary;
}

SaleManger::SaleManger()
{
	SetFixSalary();
	cin.get();
}

void SaleManger::SetFixSalary()
{
	cout << "固定薪资" << endl;
	cin >> m_FixSalary;
}

double SaleManger::getsalary()
{
	m_salary = m_FixSalary+Salesman::getsalary();
	return m_salary;
} 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值