C++ 将基类的实例传递到派生类

C++ 将基类的实例传递到派生类,c++,inheritance,C++,Inheritance,在我的应用程序中,我有一个基类类型的对象列表。每个基类都可以有多个配置(派生类),我一直在试图弄清楚如何将基类传递到派生类中,所以我不需要每次都重新初始化这些值。我知道我可以用以下方法来实现,但我很好奇是否有一种更简单/不那么笨重的方法,因为我的代码中的基类需要一段时间来初始化,并且有很多特性 简单的例子: class Base { public: Base(int a, int b) : a(a), b(b) {} protected: int a; int b; };

在我的应用程序中,我有一个基类类型的对象列表。每个基类都可以有多个配置(派生类),我一直在试图弄清楚如何将基类传递到派生类中,所以我不需要每次都重新初始化这些值。我知道我可以用以下方法来实现,但我很好奇是否有一种更简单/不那么笨重的方法,因为我的代码中的基类需要一段时间来初始化,并且有很多特性

简单的例子:

class Base {
public:
    Base(int a, int b) : a(a), b(b) {}
protected:
    int a;
    int b;
};

class Derived : public Base {
public:
    Derived(int c, int d, Base base) : c(c), d(d) {
        this->a = base.a;
        this->b = base.b;
    }
private:
    int c;
    int d;
};
或者(由于高开销,试图避免这种情况)


如果
Base
有一个复制构造函数,那么您可以简单地使用:

class Base {
public:
    Base(int a, int b) : a(a), b(b) {}
    Base(const Base& base) : a(base.a), b(base.b) {} // make your own or use the default
protected:
    int a;
    int b;
};

class Derived : public Base {
public:
    Derived(int c, int d, const Base& base) : Base(base), c(c), d(d) {}
private:
    int c;
    int d;
}

如果
Base
有一个复制构造函数,那么您可以简单地使用:

class Base {
public:
    Base(int a, int b) : a(a), b(b) {}
    Base(const Base& base) : a(base.a), b(base.b) {} // make your own or use the default
protected:
    int a;
    int b;
};

class Derived : public Base {
public:
    Derived(int c, int d, const Base& base) : Base(base), c(c), d(d) {}
private:
    int c;
    int d;
}

这两者都是错误的:在派生类中,您不能通过基对象访问基类的受保护成员。为了解决您的问题,您可以为基类定义复制构造,并使用它初始化派生类的基类部分。这两者都是错误的:在派生类中,您不能通过基类对象访问基类的受保护成员。为了解决您的问题,您可以为基类定义复制构造函数,并使用它初始化派生类的基类部分

为什么不能为基类实现一个复制构造函数?“我知道我可以用以下方法来实现”-再次检查。第一个选项甚至无效,因此大大减少了您提出的选项。并且
Base
的默认复制ctor应该足够。为什么不直接使用它(并通过const引用传递
base
)?我很好奇如何将它传递到派生类中。它看起来像这样吗(在类的实现中)=>
Base b;导出d=b?我认为您正在遭受此处未显示的糟糕设计决策的困扰,如果您正在从一个独立但相同的
Base
派生的
构建一个成本高昂的
Base
,我有一个
Base
列表,其中可以使用多个
派生的
实例。当我初始化一个
派生的
时,我试图避免重构
Base
。为什么你不能为Base实现一个复制构造函数呢?“我知道我可以用以下方法来实现”—再次检查。第一个选项甚至无效,因此大大减少了您提出的选项。并且
Base
的默认复制ctor应该足够。为什么不直接使用它(并通过const引用传递
base
)?我很好奇如何将它传递到派生类中。它看起来像这样吗(在类的实现中)=>
Base b;导出d=b?我认为您正在遭受此处未显示的糟糕设计决策的困扰,如果您正在从一个独立但相同的
Base
派生的
构建一个成本高昂的
Base
,我有一个
Base
列表,其中可以使用多个
派生的
实例。当我初始化一个
派生的
时,我试图避免重建
。谢谢,这就是我最终的结果implementing@99ProblemsAndTheyreAllCode注意,这与默认的复制构造函数同义。也就是说,在这种情况下,您根本不需要实现它。完全删除
基(const Base&Base)
并保留上面的所有内容是同义的,并且会产生相同的结果。谢谢,这就是我的结论implementing@99ProblemsAndTheyreAllCode注意,这与默认的复制构造函数同义。也就是说,在这种情况下,您根本不需要实现它。完全删除
基(const Base&Base)
并保留上面的所有内容是同义的,并且将产生相同的结果。