在创建子类复制构造函数时,是否强制使用/创建默认超级构造函数?[C++] 我试图在C++中使用超类来创建子类,而不使用任何默认构造函数,我不需要它们。

在创建子类复制构造函数时,是否强制使用/创建默认超级构造函数?[C++] 我试图在C++中使用超类来创建子类,而不使用任何默认构造函数,我不需要它们。,c++,C++,以下是课程: Object.hpp Object.cpp 类hpp Class.cpp hpp子类 子类.cpp 每当我试图用标量实例和子类的指针实例编译代码时,都会出现如下错误: ..\sources\Subclass.cpp:在复制构造函数“Subclass::subassconst Subclass&”中: ..\sources\Subclass.cpp:17:41:错误:调用“Class::Class”时没有匹配的函数 如果我为类而不是对象创建了无用的默认构造函数,我会得到同样的错误:

以下是课程:

Object.hpp

Object.cpp

类hpp

Class.cpp

hpp子类

子类.cpp

每当我试图用标量实例和子类的指针实例编译代码时,都会出现如下错误:

..\sources\Subclass.cpp:在复制构造函数“Subclass::subassconst Subclass&”中:

..\sources\Subclass.cpp:17:41:错误:调用“Class::Class”时没有匹配的函数

如果我为类而不是对象创建了无用的默认构造函数,我会得到同样的错误:

没有用于调用“Object::Object”的匹配函数


在我的例子中,我不希望这些是空的默认构造函数。有办法解决这个问题吗?

您的复制构造函数应该是:

Class::Class(const Class& other) : Object(other)
{
    x = other.x;
    y = other.y;
    z = other.z;
}

甚至,在你的情况下:

Class::Class(const Class& other) = default;
Subclass::Subclass(const Subclass& other) = default;
或者干脆在声明中省略它们

省略:初始值设定项列表中的Objectother等效于

Class::Class(const Class& other) : Object(/*Empty*/) 
{
    x = other.x;
    y = other.y;
    z = other.z;
}
由于没有对象的默认构造函数,因此无效。

请阅读

基本上,由于复制构造函数执行默认的操作,而析构函数是无用的,所以零规则应该为您完成这项工作


只需丢弃复制构造函数和析构函数的显式声明和定义。

将此作为答案发布,以获得更高的可见性

假设在运行时没有生成任何数据,也没有动态资源,那么利用编译器提供的复制构造函数和析构函数就可以了

复制/移动构造函数和析构函数的存在是为了解决您没有的问题。我推荐阅读@Marek R也链接过的文章

如果必须显式声明它们以满足某些任意要求,则可以将它们声明为默认值

例如:

// In Subclass.hpp
Subclass(const Subclass& other) = default;

为什么还要写呢?它们通过不添加任何特殊成员函数来获得正确的行为。@NathanOliver:的确如此。正如NathanOlivier所指出的,您可以=默认的复制构造函数和析构函数,或者干脆忽略它们。
#ifndef SUBCLASS_HPP_
#define SUBCLASS_HPP_

#include "Class.hpp"

class Subclass: public Class {
public:
    //constructors.
    Subclass(int u, int v, int w);
    Subclass(const Subclass& other);

    //destructor
    ~Subclass();

    //getters
    int getU();
    int getV();
    int getW();

    //setters
    void setU(int u);
    void setV(int v);
    void setW(int w);

private:
    int u, v, w;
};

#endif /* SUBCLASS_HPP_ */
#include "../headers/Subclass.hpp"

//constructors.
Subclass::Subclass(int u, int v, int w) : Class(u, v, w){
    this->u = u;
    this->v = v;
    this->w = w;
}

Subclass::Subclass(const Subclass& other){
    u = other.u;
    v = other.v;
    w = other.w;
}

//destructor.
Subclass::~Subclass(){
    u = 0;
    v = 0;
    w = 0;
    //Class::~Class();
}

//getters
int Subclass::getU(){
    return u;
}

int Subclass::getV(){
    return v;
}

int Subclass::getW(){
    return w;
}

//setters
void Subclass::setU(int u){
    this->u = u;
}

void Subclass::setV(int v){
    this->v = v;
}

void Subclass::setW(int w){
    this->w = w;
}
Class::Class(const Class& other) : Object(other)
{
    x = other.x;
    y = other.y;
    z = other.z;
}
Subclass::Subclass(const Subclass& other) : Class(other)
{
    u = other.u;
    v = other.v;
    w = other.w;
}
Class::Class(const Class& other) = default;
Subclass::Subclass(const Subclass& other) = default;
Class::Class(const Class& other) : Object(/*Empty*/) 
{
    x = other.x;
    y = other.y;
    z = other.z;
}
// In Subclass.hpp
Subclass(const Subclass& other) = default;