【问题标题】:Constructor in double inheritance双重继承中的构造函数
【发布时间】:2022-01-26 02:45:06
【问题描述】:

我的构造函数有问题。我有类车辆,然后我创建了类motorVehicle,它在vehicle 之后继承,然后我想创建类motorcycle,它在motorVehicle 之后继承,我无法创建我的默认构造函数,因为我有错误: vehiclemotorVehicle 类没有被我更改,motorcycle 类在 2 个选项中,这些选项都不起作用,但我给你两个选项。顺便说一句,问题是(第一个选项):没有匹配的构造函数用于初始化“motorVehicle”并且需要第二个选项;在表达式和预期的成员名称之后或;在声明说明符之后

class vehicle {
public:
    int numberOfWheels;
    string color;
    float vehiclePayload;

    vehicle(): numberOfWheels{4},color{"black"},vehiclePayload{500}{

    }
};
class motorVehicle : public vehicle {
public:
    float tankCapacity;
        float fuelConsumption;
        float mileage;
        float currentAmountOfFuel;
        int yearOfProduction;
        unsigned long long int vin;
        motorVehicle(): tankCapacity{30}, fuelConsumption{6}, mileage{100}, currentAmountOfFuel{10}, yearOfProduction{2021}, vin{1}, vehicle{4, "black", 500} {

        }
};


class motorcycle : public motorVehicle{
public:
    float bootSize;
    string brand;
    string model;
    motorcycle(): bootSize{500}, brand{"Ninja"}, model{"Kawasaki"}, motorVehicle{30,6,100,10,2021,1,vehicle{4, "black", 500}}{

    }

};

class motorcycle : public motorVehicle{
public:
    float bootSize;
    string brand;
    string model;
    motorcycle(): bootSize{500}, brand{"Ninja"}, model{"Kawasaki"}, motorVehicle(){30,6,100,10,2021,1,vehicle{4, "black", 500}}{

    }

};

【问题讨论】:

  • 首先,您的任何构造函数中都没有任何参数,因此 c++ 编译器将找不到匹配的构造函数。然后,如果你从一个类 (B) 继承,你只能使用它的构造函数,如果有你想传递给它的父类 (A) 的参数,你应该在构造函数中这样做: B(int foo): A(富)
  • 你的基类只有默认构造函数,也就是说,你不能直接通过成员构造函数构造值。您需要在构造函数的主体中发送,或者使用基类隐式创建的复制构造函数。另一种方法是给他们合适的构造函数。顺便说一句:public 成员变量通常表明该类不是抽象。当然,对于所有成员变量都有 getter/setter 成员函数的类也是如此。

标签: c++ object constructor default-constructor


【解决方案1】:

您的基类没有声明任何采用实际值的构造函数。由于这些类确实声明了一个默认构造函数,聚合初始化不起作用:有一个声明的构造函数,即该类不是聚合。但是,如果您想直接初始化基类,可以使用它们的隐式生成复制构造函数。但是,您仍然需要单独填充类的内容,因为您需要使用默认构造函数创建对象:

class motorVehicle : public vehicle {
public:
    float tankCapacity;
    float fuelConsumption;
    float mileage;
    float currentAmountOfFuel;
    int yearOfProduction;
    unsigned long long int vin;
    motorVehicle(): tankCapacity{30}, fuelConsumption{6}, mileage{100}, currentAmountOfFuel{10}, yearOfProduction{2021}, vin{1},
        vehicle([]{
            vehicle rc;
            rc.numberOfWheels = 4;
            rc.color = "black";
            rc vehiclePayload = 500;
            return rc;
            }()) {

    }
 };

显然,您可以使用因子函数而不是使用 lambda 函数,假设 makeVehicle(int wheels, std::string const& color, float payload) 适当地初始化成员。不过,vehicle 确实应该有一个合适的构造函数。

【讨论】:

  • 我想我明白了,但我的班级摩托车应该如何工作?
  • 您只需应用相同的技术,构造一个motorVehicle 并通过其复制构造函数而不是vehicle 对其进行初始化。
  • 非常感谢,你帮了我很多忙!
  • @Jakub:Stackoverflow 的货币正在投票给回复,假设他们回答了问题,就会接受最能回答问题的那个。
  • 很抱歉我找不到接受答案的按钮,但我已经做到了! :)
猜你喜欢
  • 2015-03-24
  • 2014-08-21
  • 1970-01-01
  • 2021-06-30
  • 2015-11-08
  • 1970-01-01
  • 2013-06-01
相关资源
最近更新 更多