0

Java(作品)

具有 Manager 和 Worker 子类的抽象类 Personnell。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 说的,输出是:

姓名 工作 年收入

汤姆·阿布尔顿 400000

Simon QuickiMart 400000 // 应该是 7280

4

2 回答 2

0

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

于 2013-10-16T23:10:24.027 回答
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;

use ->sinceemployee[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++)看起来像错字,因为数组中只有两个元素。)

于 2013-10-17T14:28:29.873 回答