在派生类的初始值设定项列表中包括基类变量

Including base class variables in the initializer list in the derived class

提问人:kristof 提问时间:8/4/2023 更新时间:8/4/2023 访问量:38

问:

我的项目是创建潜水日志。 有 DiveInfo 基类和 Equipment 派生类。 设备可能会因潜水而异,因此显然它需要根据用户给定的数据获取特定潜水的变量。

这是 Equipment.h:

#pragma once
#include "DiveInfo.h"
#include <string>

class Equipment : public DiveInfo
//manage and capture information about the diving equip
{
private:    
    std::string equipmentCondition;
    std::string equipmentType;
    std::string maskType;
    double tankSize;

public:
    Equipment(const std::string& diveSiteName, int depth, int duration, double waterTemperature, double visibility, const std::string& notes,
              const std::string& equipmentCondition, const std::string& equipmentType, const std::string& maskType, double tankSize);
    
    std::string getEquipmentType() const;
    std::string getEquipmentCondition() const;
    double getTankSizeI() const;
    double getSac() const;
};

我已经在 DiveInfo 中为这些变量提供了一个构造函数(从 diveSiteNames 'til notes)。 问题是,我是否必须在 Equipment.h 构造函数的初始值设定项列表中包含 DiveInfo 的变量? 这可能也是一个大胆的问题,但这不能用一些虚拟功能或一些模板来完成吗?还是会使事情完全复杂化?

C++ 构造函数 Derived-Class base-class

评论

0赞 sweenish 8/4/2023
我不确定继承在这里是否正确。
0赞 Peter 8/4/2023
仔细阅读构造函数初始化器列表。

答:

4赞 Some programmer dude 8/4/2023 #1

每个类都应该初始化自身,并且只初始化自身。它应该让父类进行自己的初始化。

为此,在构造函数初始值设定项列表中,第一件事是“调用”基类构造函数。

举个简单的例子:

struct base
{
    int value;

    base(int val)
        : value{ val }
    {
    }
};

struct derived : base
{
    std::string string;

    derived(int val, std::string const& str)
        : base{ val }, string{ str }
    {
    }
};

构造函数初始值设定项列表首先调用类构造函数进行初始化,然后调用成员初始化。derivedbasederived