虚函数使用测试(c++)

// employ2.h
// Abstract base class employee

#ifndef EMPLOY2_H
#define EMPLOY2_H

#include <iostream.h>

class Employee{
public:
	Employee( const char *,const char * );
	~Employee();
	const char *getFirstName() const ;
	const char *getLastName() const ;

	// pure virtual function make employee abstract base class
	virtual double earnings() const = 0;                             // 带有纯虚函数的类就是一个抽象类,抽象类是不允许定义对象的
	virtual void print() const ;                                     // 虚函数的print 在后面的类可以直接继承,也可以改写
private:
	char *firstName;     //员式的first 和 last 名字
	char *lastName;
};


#endif
//employ2.cpp
// member function definitions for abstract base class employee

// Note :No definitions given for pure vitural functions

#include <string.h>
#include <assert.h>
#include "employ2.h"


Employee::Employee( const char *first,const char *last )
{
	firstName = new char[ strlen( first )+1 ];
	assert( firstName != 0 );
	strcpy( firstName,first );

	lastName = new char[ strlen( last )+1 ];
	assert( lastName != 0 );
	strcpy( lastName,last );
}


Employee::~Employee()
{
	delete [] firstName;
	delete [] lastName;
}

const char *Employee::getFirstName() const 
{
	return firstName;
}


const char *Employee::getLastName() const
{
	return lastName;
}


//print the name of the employee
void Employee::print() const
{
	cout<< firstName << ' ' << lastName;
}


// boss1.h
// boss class derived from employee

#ifndef BOSS1_H
#define BOSS1_H
#include "employ2.h"

class Boss : public Employee{
public:
	Boss( const char *,const char *,double = 0.0 );
	void setweeklysalary( double );
	virtual double earnings() const;                      //??
	virtual void print() const;

private:
	double weeklysalary;
};


#endif

// boss1.cpp
// member function definitions for class boss

#include "boss1.h"

Boss::Boss( const char *first, const char *last, double s ):Employee( first, last )
{
	setweeklysalary( s );
}

void Boss::setweeklysalary( double s)
{
	weeklysalary = s >0?s:0;
}

double Boss::earnings() const { return weeklysalary; }

void Boss::print() const
{
	cout<<"\n	Boss:";
	Employee::print();                // 调用基类的要注明作用域 ::
}

// commis1.h
// commissionworker class derived from employee

#ifndef COMMIS1_H
#define COMMIS1_H

#include "employ2.h"

class commissionworker : public Employee{
public:
	commissionworker( const char *, const char *, double = 0.0, double = 0.0, int =0 );
	void setsalary( double );
	void setcommission( double );
	void setquantity( int );
	virtual double earnings() const;
	virtual void print() const;
private:
	double salary;
	double commission;
	int quantity;
};

#endif
// commis1.cpp
// member function definitions for class commissionworker

#include <iostream.h>
#include "commis1.h"

commissionworker::commissionworker( const char *first, const char *last, double s, double c, int q )
:Employee( first, last )
{
	setsalary( s );
	setcommission( c );
	setquantity( q );
}

void commissionworker::setsalary( double s )
{
	salary = s>0? s: 0;
}

void commissionworker::setquantity( int q )
{
	quantity = q >0 ?q :0; 
}

double commissionworker::earnings() const
{ return salary + commission * quantity; }

void commissionworker::print() const
{
	cout<<"\n commission workder: ";
	Employee::print();
}

void commissionworker::setcommission( double c )
{
	commission = c >0 ? c: 0;
}
// piece1.h
// declare class piece
// derived from base class employee

#ifndef PIECE1_H
#define PIECE1_H

#include "employ2.h"
class Pieceworker : public Employee{
public:
	Pieceworker( const char *, const char *, double = 0.0,int =0 );
	void setwage ( double );
	void setquantity( int );
	virtual double earnings() const;
	virtual void print() const;
private:
	double wageperpiece;
	int quantity;
};

#endif
// piece1.cpp

// member function definitions for class pieceworker

#include <iostream.h>
#include "piece1.h"

Pieceworker::Pieceworker( const char *first, const char *last, double w, int q )
:Employee( first , last )
{
	setwage( w );
	setquantity ( q );
}

void Pieceworker::setwage( double w )
{
	wageperpiece = w>0 ? w : 0;
}

void Pieceworker::setquantity( int q )
{
	quantity = q>0 ?q:0 ;
}

double Pieceworker::earnings() const
{
	return quantity * wageperpiece;
}

void Pieceworker::print() const
{
	cout<<" \n		piece worker : ";
	Employee::print();
}
//虚函数使用测试

#include <iostream.h>
#include <iomanip.h>
#include "employ2.h"
#include "boss1.h"
#include "commis1.h"
#include "piece1.h"

void virtualviapointer ( const Employee * );
void virtualviareference( const Employee & );

int main()
{
	cout<< setiosflags( ios::fixed | ios::showpoint )
		<< setprecision (2);

	// Employee e;                              // 抽象类不允许声明对象  尽管不能实例化抽象基类的对象,但是可以声明引用抽象类的指针 
	Boss b( "John", "Smith", 800.00 );
	b.print();
	cout<<" earned $" << b.earnings();
	virtualviapointer ( &b );
	virtualviareference ( b );

	commissionworker c( "Sue", "Jones", 200.0,3.0,150 );
	c.print();
	cout<<" earned $" << c.earnings();
	virtualviapointer ( &c );
	virtualviareference ( c );

	Pieceworker p( "BOb", " Lewis" ,2.5, 200 );
	p.print();
	cout<<" earned $" << p.earnings();
	virtualviapointer ( &p );
	virtualviareference ( p );
	cout<<endl;


	return 0;
}


void virtualviapointer ( const Employee *baseclassptr )
{
	baseclassptr->print();
	cout<< " earned $ "<< baseclassptr->earnings();
}

void virtualviareference( const Employee &baseclassref )
{
	baseclassref.print();
	
	cout<< " earned $ "<< baseclassref.earnings();
}

转载于:https://my.oschina.net/delmore/blog/4294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值