用C ++实现简单的Java程序(抽象类)

时间:2013-10-16 22:25:34

标签: java c++ arrays polymorphism abstract-class

Java(Works)

抽象类Personnell,包含Manager和Worker的子类。 getAnnualIncome()是抽象函数。

Personnell employee[] = 
{
    new Manager("Thomas", "Nasa", 1337, 250000),
    new Worker("Simon", "Netto", 1336, 6.98, 36)
};
System.out.println("Name\t\tAnnual Income");
for (int i = 0; i < employee.length; i++)
{
System.out.printf(employee[i].getName() + "\t\t£%.2f%n", employee[i].getAnnualIncome());
}

C ++(不起作用)

Personnell employee[] = 
{
    Manager ("Tom", "Ableton", 1234, 400000),
    Worker ("Simon","QuickiMart", 666, 40, 3.50)
};

cout << "Name\t\tJob\t\tAnnual Income"<< endl<<endl;
for (int i = 0; i < 3; i++)
{
    cout << employee[i].getName() << "\t\t"<< employee[i].getDept()<<"\t\t"<< employee[0].getAnnualIncome() << endl;
}

错误:不允许使用抽象类“Personnell”的数组: 函数“Personnell :: getAnnualIncome”是纯虚函数

尝试了一些与指针不同的事情,但我仍然需要了解它们。 谢谢,汤姆

编辑(添加定义和声明) Personnell已经

virtual double getAnnualIncome()=0;

经理

double getAnnualIncome(); //declaration
double Manager::getAnnualIncome() //definition
{

return this->salary_;
}

工人

double getAnnualIncome(); //declaration
double Worker::getAnnualIncome() //definition
{
return (this->hourlyRate_ * this->hoursPerWeek_)*52;
}

做ajb所说的,输出是:

姓名工作年收入

Tom Ableton 400000

Simon QuickiMart 400000 //应为7280

2 个答案:

答案 0 :(得分:0)

在C ++中,当您使用基类对象的类型创建数组时,会发生一种称为对象切片的事情:即,当您声明一个抽象类的数组并将子类放入其中时,只有抽象部分(即存储纯虚拟机。正如您所看到的,您无法调用纯虚函数,因为employee数组中的对象是切片对象。

答案 1 :(得分:0)

您不能拥有Personnell个对象数组,因为Personnell是一个抽象类型,编译器不会知道每个数组元素的大小。所以你需要使用指针。 (它在Java中工作,因为实际上,Java会自动使用指针。)

employee定义更改为

Personnell *employee[] = 
{
    new Manager ("Tom", "Ableton", 1234, 400000),
    new Worker ("Simon","QuickiMart", 666, 40, 3.50)
};

而不是

cout << employee[i].getName() << "\t\t"<< employee[i].getDept()<<"\t\t"<< employee[0].getAnnualIncome() << endl;

使用->,因为employee[i]现在是一个指针:

cout << employee[i]->getName() << "\t\t"<< employee[i]->getDept()<<"\t\t"<< employee[i]->getAnnualIncome() << endl;

(最后一个employee[0]是一个拼写错误,应该更改为employee[i];另外,for (int i = 0; i < 3; i++)看起来像一个拼写错误,因为数组中只有两个元素。)