#include <afx.h>
#include <afxtempl.h>
#include "StdAfx.h"
class Employee
{
char name[30];
public:
Employee() {}
Employee(const char* nm)
{
strcpy(name, nm) ;
}
char* getName() const;
virtual double computePay() const = 0;
virtual ~Employee()
{
}
};
class WageEmployee : public virtual Employee
{
double wage;
double hours;
public:
WageEmployee(const char* nm);
void setWage( double wg ){wage = wg; }
void setHours(double hrs){hours = hrs;}
double computePay() const /* Implicitly virtual */
{
return wage * hours;
}
};
class SalesPerson : public WageEmployee
{
double commission;
double salesMade;
public:
SalesPerson(const char* nm);
void setCommission(double comm)
{
commission = comm;
}
void setSales(double sales)
{
salesMade = sales;
}
double computePay() const /* Implicitly virtual */
{
return WageEmployee::computePay() + commission * salesMade;
}
};
class Manager : public virtual Employee
{
double weeklySalary;
public:
Manager(const char* nm);
void setSalary(double salary){weeklySalary = salary; }
double computePay() const /* Implicitly virtual */
{
return weeklySalary;
}
};
class SalesManager : public SalesPerson, public Manager
{
public:
SalesManager::SalesManager(const char* nm)
:Employee(nm),Manager(nm),SalesPerson(nm)
{
}
double computePay() const /* Implicitly virtual */
{
return Manager::computePay() + SalesPerson::computePay();
}
};
typedef CTypedPtrList < CPtrList, Employee* > CEmployeeList;
class EmployeeList
{
CEmployeeList List;
public:
EmployeeList() {}
CEmployeeList& GetElements() { return List; }
void Add(Employee* newEmp)
{
List.AddTail(newEmp) ;
}
virtual ~EmployeeList()
{
POSITION pos = List.GetHeadPosition() ;
while (pos != NULL)
{
delete List.GetNext(pos) ;
}
List.RemoveAll() ;
}
};
WageEmployee::WageEmployee(const char* nm)
:Employee(nm)
{
wage = 0.0;
hours = 0.0;
}
SalesPerson::SalesPerson(const char* nm)
:WageEmployee(nm)
{
commission = 0.0;
salesMade = 0.0;
}
Manager::Manager(const char* nm)
:Employee(nm)
{
weeklySalary = 0.0;
}
void main(int argc, char *argv[])
{
int ans = 0 ;
EmployeeList myDept;
WageEmployee* wagePtr;
SalesPerson* salePtr;
Manager* mgrPtr;
SalesManager* smPtr;
wagePtr = new WageEmployee("Alan Wage");
salePtr = new SalesPerson("Brian Sale");
mgrPtr = new Manager("Clive Manager");
smPtr = new SalesManager("David SaleManager");
wagePtr->setWage(10.0);
wagePtr->setHours(35.0);
salePtr->setWage(5.0);
salePtr->setHours(35.0);
salePtr->setCommission(0.05);
salePtr->setSales(100.0);
mgrPtr->setSalary(600.0) ;
smPtr->setSalary(670.0) ;
smPtr->setCommission(0.01);
smPtr->setSales(100.0);
myDept.Add(wagePtr);
myDept.Add(salePtr);
myDept.Add(mgrPtr);
myDept.Add(smPtr);
double payroll = 0.0 ;
Employee* person ;
POSITION pos = myDept.GetElements().GetHeadPosition() ;
while (pos != NULL)
{
person = (Employee*)myDept.GetElements().GetNext(pos) ;
payroll += person->computePay();
}
ExitProcess(ans) ;
}
上面是具有多重繼承的Visual C++。
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
namespace ConsolePoly
{
interface Employee
{
string Name { get; set; }
double computePay();
}
class WageEmployee : Employee
{
private string iName = "";
virtual public string Name { get { return iName; } set { iName = value; } }
public double wage { get; set; }
public double hours { get; set; }
public WageEmployee(string nm)
{
Name = nm;
wage = 0.0;
hours = 0.0;
}
virtual public double computePay() { return wage * hours; } /* Implicitly virtual c++ */
}
class SalesPerson : WageEmployee
{
public double commission { get; set; }
public double salesMade { get; set; }
public SalesPerson(string nm)
: base(nm)
{
commission = 0.0;
salesMade = 0.0;
}
override public double computePay()
{
return base.computePay() + commission * salesMade;
} /* Implicitly virtual c++ */
}
class Manager : Employee
{
private string iName = "";
virtual public string Name { get { return iName; } set { iName = value; } }
public double weeklySalary { get; set; }
public Manager(string nm)
{
Name = nm;
weeklySalary = 0.0;
}
public Manager()
{
weeklySalary = 0.0;
}
public double computePay() { return weeklySalary; } /* Implicitly virtual c++ */
}
class SalesManager : Manager, /*SalesPerson,*/ Employee
{
public SalesManager(string nm)
{
Name = nm;
//SalesPerson(nm);
//commission = 0.01;
//salesMade = 100.0;
}
public double computePay() { return base.computePay();/*Manager.computePay()+SalesPerson.computePay();*/ }
}
class EmployeeList
{
private List<Employee> list = new List<Employee>();
public List<Employee> GetElements() { return list; }
public void Add(Employee newEmp) { list.Add(newEmp);}
public EmployeeList() {}
}
class poly
{
public poly()
{
}
public virtual void generate()
{
EmployeeList myDept = new EmployeeList();
WageEmployee wagePtr = new WageEmployee("Alan Wage");
SalesPerson salePtr = new SalesPerson("Brian Sale");
Manager mgrPtr = new Manager("Clive Manager");
SalesManager salemanPtr = new SalesManager("David SaleMan");
wagePtr.wage=10.0;
wagePtr.hours=35;
salePtr.wage= 5.0 ;
salePtr.hours= 35.0 ;
salePtr.commission= 0.05 ;
salePtr.salesMade= 100.0 ;
mgrPtr.weeklySalary=600.0;
salemanPtr.weeklySalary = 670;
myDept.Add(wagePtr);
myDept.Add(salePtr);
myDept.Add(mgrPtr);
myDept.Add(salemanPtr);
double payroll = 0.0 ;
List<Employee> list = myDept.GetElements();
foreach (Employee person in list)
{
Console.WriteLine("personName(\"{0}\")\tcomputePay(\"{1}\")", person.Name, person.computePay());
payroll += person.computePay();
}
Console.WriteLine("computePay(\"{0}\")\n", payroll.ToString());
}
static void Main(string[] args)
{
try
{
new poly().generate(); //new poly(args[0], args[1]).generate();
}
catch (IndexOutOfRangeException ioe)
{
System.Console.Error.WriteLine(ioe);
}
}
}
}
但在C#中SalesManager的多重繼承不支持語言。
我個人很高興失去多重繼承。
一個很好的例子爲MI,我能想到的將是一個科學模型級輕型的,它是一個兩波和粒子。 – snicker 2009-10-28 14:07:35