c++中操作符的继承

Inheritance of operators in c++

本文关键字:继承 操作符 c++      更新时间:2023-10-16

我在这个网站上读过很多类似的问题,但没有一个能回答我想做的。

public class base {
public:
    base(){
        //Default Constructor
    }
    base( int num ){
        // use num to create base
    }
    base& operator=( base&& _data ){
        // do move assignment stuff
    }
};
public class derived : public base {
public:
    derived() : base() {
        int num1;
        //Do some stuff
        // Now I want to assign the base of this class with a new base
        base::operator=( Base( num1 ) );
    }
};

我想在派生类的构造过程中调用基类上的move赋值(或只是常规赋值)。这样,派生类可以在创建基类之前解析一些信息。这似乎行不通。有人有什么想法吗?

请记住,基类是在构造函数体进入之前初始化的。因此,使用您的方法,您首先初始化base,然后通过赋值覆盖它。这可不妙。

使用委托构造函数和私有帮助函数:

class derived : public base {
private:
    static int help () { /* Do some stuff */ }
    // private constructor to be called with the helper values
    derived (int i) : base (i) { }
public:
    derived() : derived (help ()) { }
};
当然,在这种情况下,您可以通过 来定义构造函数
derived () : base (help ()) { }

但是,如果必须为基类构造函数计算多个参数值,那么上面的委托构造函数方法就很有用了:

class base {
public:
    base (int i, double d);
};
class derived : public base {
private:
    struct BaseParams { int i; double d; };
    static BaseParams help () {
        BaseParams p;
        /* Do some stuff and set p.i and p.d */;
        return p;
    }
    // private constructor to be called with the helper values
    derived (BaseParams const & p) : base (p.i, p.d) { }
public:
    derived() : derived (help ()) { }
};

如果你真的想构造一个base对象并移动它,使用base的move构造函数:

class base {
public:
    base (int i, double d);
    base (base &&);
};
class derived : public base {
private:
    static base help () {
        /* Do some stuff and finally construct a base object */;
        return base { /* calculated parameters for constructor of base */ };
    }
    // private constructor to be called with a base object to move from
    derived (base && b) : base (std::move (b)) { }
public:
    derived() : derived (help ()) { }
    // or simply derived () : base (help ()) { }
};