2015-08-25 69 views
0

我已经在这个网站上看过很多类似的问题,但没有回答我想要做的事情。C++中操作符的继承关系

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

我想在派生类的构造过程中调用基类的移动赋值(或只是定期赋值)。通过这种方式,派生类可以在创建基础之前解析一些信息。这似乎并不奏效。有人有主意吗?

+2

定义“似乎并没有工作。”另外,你为什么要做这样的事情?只需用正确的编号直接构建'base'即可。 – Barry

+0

@Barry:从它的外观来看,当'base'构造函数被调用时,这个数字可能还不知道,所以它不能在构造函数参数中传递。 –

+0

我假设'Base(num1)'你的意思是'base(num1)'? –

回答

1

请记住,基类在初始化之前构造函数体被输入。因此,用你的方法,你首先初始化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对象和移动它,使用基地的转移构造函数:

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()) { } 
};