在创建派生类对象时,哪种方法可以初始化基类成员?

时间:2011-08-25 10:30:51

标签: c++

方法1:通过dervive类的构造函数初始化

class base {
protected:
    int no;
public:
    void showData() {
        cout << no;
    }
};

class der : public base {
public:
    der(int _no) {
        no = _no;
    }
};

方法2:通过基类的构造函数初始化

class base {
    int no;
protected:
    base(int _no) : no(_no){}

public:
    void showData() {
        cout << no;
    }
};

class der : public base {
public:
    der(int _no) : base(_no) {
    }
};

客户代码:

der d(10);
d.showData();

如果有其他方法,请告诉我

6 个答案:

答案 0 :(得分:3)

您应该使用第二种方法,原因之一是:如果基类成员是private,则方法一不起作用。看到派生类初始化不属于它的东西也很奇怪。

答案 1 :(得分:2)

每个班级应该初始化该班级中的字段。所以第二个变种。

答案 2 :(得分:2)

显然是出于各种原因的第二种选择:

  • 让类的构造函数执行其任务:构造。让每个类初始化自己的数据成员。
  • 数据成员可能是私有的,派生类可能无法访问。
  • 选项1将涉及所有派生类的代码维护,这肯定会导致错误。
  • 就装箱而言,选项1并不是一个好的方法。

答案 3 :(得分:0)

我强烈选择方法2,因为构造函数也可能比初始化变量更复杂。此外,case中的私人成员无法在der中设置。

答案 4 :(得分:0)

第二种是正确的方法。最好用构造函数初始化,这就是它们的用途。如果您有多个派生类,您会怎么做?如果你想自己创建基类对象怎么办?将初始化代码放在构造函数中,这就是C ++的工作方式。

答案 5 :(得分:0)

始终使用ctor-initializer初始化事物。因为这是您可以真正初始化事物的唯一地方。在任何地方写no=no_分配到已初始化的变量。对于UDT,这可能是一个很大的区别,对于甚至不可能的引用,你总是必须初始化它们。

因此,为了均匀性,在任何地方都使用ctor-initalizer。