c++ - 为什么我的派生类构造函数被删除了?

标签 c++ constructor copy default

在下面我的编译器说找不到我的派生类构造函数:

    struct Drink
    {
        Drink(const Drink& other);
    };

    struct PepsiMax : Drink {};

    int main()
    {
        PepsiMax myPepsi;         // <--- the default constructor of PepsiMax cannot be referenced, it is a deleted function
    }

我知道需要定义 Drink 的默认构造函数,因为我创建了一个复制构造函数,而编译器不会为我创建默认构造函数。但是,错误消息说它找不到我期望它生成的 PepsiMax 类的默认构造函数。如果我为 PepsiMax 定义了默认构造函数,它会显示一条错误消息,指出找不到 Drink 默认构造函数,这正是我所期望的。

我可以假设它指的是“Drink”而不是“PepsiMax”的默认构造函数,还是我误解了什么?我希望编译器为“PepsiMax”创建一个默认构造函数,它会在第一件事时立即调用基类构造函数。

编辑:我的困惑被清除了,感谢您的帮助。我对编译器生成的构造函数的天真解释的解释在一个答案中。

最佳答案

解决办法是写

struct Drink
{
    Drink() = default;
    Drink(const Drink& other);
};

复制构造函数的存在避免了默认构造函数的自动生成(如您所知)。但这也意味着编译器无法为 PepsiMax 生成 PepsiMax myPepsi; 所依赖的默认构造函数。您需要重新引入它。

关于c++ - 为什么我的派生类构造函数被删除了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41279161/

相关文章:

c++ - 使用 copy_if 复制 std::string(到另一个字符串)

c++ - 在 C++ 中打印百分比

c++ - 将 3 维数组引用转换为 1 维数组

c++ - QTcpSocket 在几次成功连接后发出 "Connection Refused Error"?

java - 什么时候在java中使用Long vs long?

c# - 如何在 C# 中调用 protected 构造函数?

c++ - 在 C++ 中使用 extern 时出错

不使用其构造函数的 C++ 类声明

将字符串复制到指针似乎不起作用

c++ - 复制具有多态内容的 std::unique_ptr 的 std::map