从基派生函数 class

Deriving functions from a base class

我可能走错了路。我被要求创建一个特定 class 的对象数组。然而,class 有两个派生的 classes.

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;
}

我想问的问题是,base class 可以调用派生的 class 方法吗?例如,如果我为 Salary class 创建了一个名为 getgross 的方法: 我可以调用这样的方法吗:Employee.getgross()?如果不是,我如何调用 subclass 方法?

Employee class 中将 getgross() 声明为 virtual

示例:

class Employee {
     virtual int getgross();
}

class Salary: public Employee {
     virtual int getgross();
}

每当您在指向 Salary 对象的 Employee* 上调用 getgross() 时,将调用 Salarygetgross()
我也将 virtual 添加到 Salary::getgross(),目前不需要,但最好现在包含它,因为您可能想要导出 class 形式 Salary稍后。

数组需要是指针数组以避免slicing problem。更好的方法是使用 vector 智能指针。

为避免切片,您需要存储指向对象的指针

Employee* data[100];

然后您可以从各种派生的 classes 创建对象并将它们放入数组中,例如

data[0] = new Salary;

为了调用正确的方法,您需要在基础 class 中声明一个虚拟方法,然后在您的派生 classes 中覆盖它。

最好的方法是在基础 class 中创建方法 getGross()(虚方法),这样派生的 class 就可以继承它。

一些想法:

  1. 您需要存储指向员工的指针数组。一个简单的 Employees 数组是行不通的。每次向数组中添加一个 Employee 时,它​​将 "truncated" 减到基数 class,任何额外的信息都将丢失。
  2. 您可以使用 dynamic_cast 测试指针的类型,因此您可以在调用之前检查类型。您不能以其他方式调用给定基本 class 指针(或引用)的仅派生成员函数。
  3. 旧指南 "prefer containment over inheritance" 可以以完全不同的方式解决问题。只需将薪酬类型设为 Employee 的 属性,并完全失去继承权。

正如其他人所说,您必须在数组中使用指向 Employee 对象的指针而不是 Employee 对象。这样,Employee 指针可以指向从 Employee 派生的任何 class。

我认为您要做的是在 Employee 基 class 中实现该方法,并让所有派生的 class 都可以使用它。如果是这样,以下应该是您的答案。

(从这里借用这个答案):

How can a member function in my derived class call the same function from its base class?

"使用Base::f();

先从一个简单的案例说起。当你调用一个非虚函数时,编译器显然不使用虚函数机制。相反,它使用成员函数的完全限定名称按名称调用函数。例如,下面的 C++ 代码……

void mycode(Fred* p)
{
p->goBowling();  // Pretend, Fred::goBowling() is non-virtual

}

…可能会被编译成类似 C 语言的代码(p 参数成为成员函数中的 this 对象):

void mycode(Fred* p)
{
__Fred__goBowling(p);  // Pseudo-code only; not real
}

实际的名称修改方案比上面暗示的简单方案复杂得多,但您明白了。关键是这个特殊情况并没有什么奇怪的——它解析为一个或多或少像 printf() 的普通函数。

现在针对上述问题中涉及的情况:当您使用其完全限定名称(class-名称后跟“::”)调用虚函数时,编译器不会使用虚拟调用机制,而是使用与调用非虚拟函数相同的机制。换句话说,它通过名称而不是槽号来调用函数。所以如果想让derivedclassder里面的代码调用Base::f(),也就是定义在它的baseclassBase中的f()的版本,应该这样写:

void Der::f()
{
Base::f();  // Or, if you prefer, this->Base::f();
}

编译器会将其转换成类似于以下的内容(再次使用过于简单的名称修改方案):

void __Der__f(Der* this)  //Pseudo-code only; not real
{
    __Base__f(this);        // Pseudo-code only; not real
}