Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C+实现简单Java程序+;(抽象类)_Java_C++_Arrays_Polymorphism_Abstract Class - Fatal编程技术网

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

用C+实现简单Java程序+;(抽象类),java,c++,arrays,polymorphism,abstract-class,Java,C++,Arrays,Polymorphism,Abstract Class,爪哇(工场) 抽象类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;

爪哇(工场)

抽象类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());
}
经理有

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


<西蒙> QuiimIART 400000//C++中应该是7280</p>< p>,当你创建一个带有基类对象类型的数组时,会发生一个叫做对象切片的东西:即当你声明一个抽象类的数组,并在其中放置子类时,只存储抽象部分(即纯的虚拟)。正如您所看到的,您不能调用纯虚拟函数,因为
employee
数组中的对象是切片对象。

您不能拥有
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[0]
是一个输入错误,应该改为
employee[i]
;另外,
for(int i=0;i<3;i++)
看起来像是一个输入错误,因为数组中只有两个元素。)

您可以添加类的定义和实现吗,太好了?您是否同时在
管理器
工作者
中覆盖了
人员所有::getAnnualIncome
?我没有尝试过这个,但是。。。尝试将
Personnell employee[]=
更改为
Personnell*employee[]=/code>,在员工数组值中的
经理
员工
前面放置一个
new
,并将
employee[i].getName()
更改为
employee[i]->getName()
[其他字段也是如此]。您不能拥有
Personnell
对象的数组,因为这是抽象的,编译器不知道每个数组元素的大小。这就是为什么你需要指针。P.S.我不是C++专家,所以我不能保证我有正确的答案。谢谢,这使它更接近工作。但是,所有数组都带有数组中第一项的值。i、 e所有的年收入都是40万如果是这样的话,你能把我的名字加到名单上吗
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;
cout << employee[i]->getName() << "\t\t"<< employee[i]->getDept()<<"\t\t"<< employee[i]->getAnnualIncome() << endl;