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

Pass instance of base class into derived class

本文关键字:派生 基类 实例      更新时间:2023-10-16

在我的应用程序中,我有一个基类类型的对象列表。每个基类都可以有多个配置(派生类),我一直在试图弄清楚如何将基类传递到派生类,这样我就不需要每次都重新初始化值。我知道我可以这样做,但我很好奇,如果有一个更容易/不笨拙的方式,因为基类在我的代码需要一段时间来初始化,并有很多特性。

简单的例子:

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;
};

OR(由于开销大,试图避免这种情况)

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, 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;
}

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

的基部分。