我正在编写一个包含基类RentedVehicle及其派生类FuelVehicle和FuelVehicle派生类作为Car类的程序。我的代码是:

#include<iostream>
using namespace std;

class RentedVehicle {
private:
    double baseFee;
public:
    RentedVehicle() {};
    RentedVehicle(int a): baseFee(a) {
    };

    virtual double getCost() {
        return baseFee;
    }

};

class FuelVehicle: public RentedVehicle {
private:
    double kms;
public:
    int mileageFees = 0;
    FuelVehicle() {};
    FuelVehicle(double a, int b): RentedVehicle(a) {
        kms = b;
    };

    double getMileageFees() {

        if (kms < 100) {
            mileageFees = 0.2*kms;
        } else if (kms >= 100 && kms <= 400) {
            mileageFees = 0.3*kms;
        } else if (kms > 400) {
            double x = (kms - 400);
            mileageFees = (0.3*kms) + (0.5*x);
        }
        return mileageFees;
    }

    double getKms() {
        return kms;
    }
};

class Car: public FuelVehicle {
private:
    int seats;
public:
    Car() {};
    Car(int a, double b, double c):  FuelVehicle(b, c) {
        seats = a;
    };
    double bF = getCost();
    double mF = getMileageFees();
    double getCost() {
        double cost = mF + (bF*seats);
        return cost;
    }
    int getSeats() {
        return seats;
    }
};


int main() {
    Car c1(5, 500, 20);
    double y = c1.getCost();
    cout << "cost is: " << y << endl;
    return 0;
}

当我调用重写的getCost()方法时,它显示的成本是:4 。但是,对我给定的参数而言,费用应为 2504
怎么了

最佳答案

在这行上:

double bF = getCost();
Car类中,您正在调用getCost的最派生版本。但是这个功能:
double getCost() {
        double cost = mF + (bF*seats);
        return cost;
    }
将调用未定义的行为,因为在初始化之前在此函数中使用bF
相反,您可以使用getCost的基类版本,如下所示:
double bF = FuelVehicle::getCost();
打印出期望值2504。
这是demo

关于c++ - 在C++中调用重写的方法后得到错误的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63079627/

10-11 22:50
查看更多