这是在创建派生类对象时初始化基类成员的更好方法
Which is the better approach to initialise the base class member while creating derive class object?
方法1:通过派生类的构造函数初始化
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();
请告诉我是否有其他方法
您应该使用第二种方法,原因之一是:如果基类成员是private
,方法一将不起作用。派生类初始化不属于它的东西也是很奇怪的。
每个类元素都应该初始化该类中的字段。所以第二个变体。
由于各种原因,显然第二个选择是:
- 让类的构造函数完成它的任务:Construction。让每个类初始化自己的数据成员。
- 数据成员可以是私有的,派生类不能访问。
- 选项1将涉及所有派生类的代码维护,这肯定会导致错误。
- 选项1就封装而言不是一个好方法。
我强烈选择方法2,因为构造函数也可能比仅仅初始化变量更复杂。case
中的private成员不能在der
中设置
第二种是正确的方法。用构造函数初始化总是最好的,这就是构造函数的作用。如果你有一个以上的派生类,你会怎么做?如果想自己创建基类对象该怎么办?把初始化代码放在构造函数中,这就是c++的工作原理。
总是使用变量初始化器来初始化事物。因为这是你唯一可以初始化东西的地方。在任何地方写no=no_
将赋给给一个已经初始化的变量。对于udt,这可能是一个很大的区别,对于引用,这甚至是不可能的,您总是必须初始化它们。
所以为了一致性,在所有地方都使用大写字母
相关文章:
- C++类 - 初始化列表 - 递归 - 按值传递
- 何时为派生类初始化 vptr?
- 虚拟基类初始化
- 类初始化中的静态 lambda
- 如何防止在基类初始化器中调用默认构造函数?
- 如何在派生类中存储基类初始化期间获得的信息
- 是否可以在基类初始化器列表中传递成员对象
- 多重继承、复制构造函数和基类初始化
- 是否将类初始化的常量成员传递给基构造函数
- C++是否要求您从其派生类初始化基类成员
- 如何使用运行时选择基 CTOR 初始化不可复制的基类
- 继承和复制构造函数-如何从基类初始化私有字段
- 在使用虚拟继承时,我可以避免重复的基类初始化吗
- 基类初始化器和成员变量初始化器的顺序重要吗
- 在初始化列表中基类初始化之前调用函数
- 虚拟基类初始化
- 尽管类名与C++完全匹配,但模板基类初始化构造函数失败
- 初始化派生类初始化器列表中的基类成员
- 了解基类初始化
- 关于派生类初始化中的基类