我可能会采取这种错误的方式。我被要求创建一个特定类的对象数组。但是,该类有两个派生类。
class Employee {
// Some stuff here about the backbone of the Employee class
}
class Salary: public Employee {
// Manipulation for Salary employee
}
class Hourly: public Employee {
// Manipulation for hourly Employee
}
// Main Program
int main (int argc, char**argv) {
Employee data[100]; // Creates an array of Employee objects
while (employeecount > 100 || employeecount < 1) {
cout << "How many employees? ";
cin >> employeecount;
}
for(int x = 0; x <= employeecount; x++) {
while (status != "S" || status != "s"|| status != "H" || status != "h") {
cout << "Employee Wage Class (enter H for hourly or S for Salary)";
cin >> status;
}
if (status == "S" || status == "s") { // Salaried Employee
new
} else { // We valid for hourly or salary, so if its not Salaried it's an hourly
}
}
return 0;
}
我想问的问题是,基类可以调用派生类方法吗?例如,如果我为名为getgross
的Salary类创建了一个方法:我可以调用这样的方法:Employee.getgross()
吗?如果不是,我怎么能调用子类方法?
答案 0 :(得分:3)
为避免切片,您需要存储指向对象的指针
Employee* data[100];
然后,您可以从各种派生类创建对象,并将它们放入数组中,例如
data[0] = new Salary;
为了调用正确的方法,您需要在基类中声明一个虚拟的方法,然后在派生类中重写该方法。
答案 1 :(得分:2)
在getgross()
类中将virtual
声明为Employee
。
示例:
class Employee {
virtual int getgross();
}
class Salary: public Employee {
virtual int getgross();
}
如果您在getgross()
上呼叫Employee*
指向Salary
个对象,则会调用getgross()
Salary
。
我也将virtual
添加到Salary::getgross()
,目前暂不需要,但现在最好将其包含在内,因为您可能希望稍后派生一个类形式Salary
。
数组需要是一个指针数组,以避免slicing problem。更好的是使用vector
智能指针。
答案 2 :(得分:2)
最好的方法是在基类(虚方法)中创建方法getGross(),以便派生类可以通过继承来获取它。
答案 3 :(得分:1)
一些想法: