- 子类构造函数不能构造父类的属性,父类的属性只能在父类构造函数中进行构造
错误写法:
class Animal{
public:
int age_;
}
class Dog: public Animal{
public:
Dog(int age): age_(age){} // 这样是错误的
}
正确做法:
class Animal{
protected:
int age_;
public:
Animal(int age) : age_(age) {} // 父类构造函数中构造父类属性
}
class Dog: public Animal{
public:
Dog(int age): Animal(age) {} // 子类构造函数中通过调用父类的构造函数来构造父类属性
}
- 构造函数初始值列表的顺序需与属性的定义顺序相同 (这个检查不是严格的,这样做可以避免参数之间的初始化如果存在依赖关系时会出现问题。)
错误的
class Animal{
private:
int age_; // 先 age
string color_; // 再 color
public:
Animal(int age, string color) : color_(color), age_(age) {} // 顺序不对,错误
}
正确的
class Animal{
private:
int age_;
string color_;
public:
Animal(int age, string color) : age_(age), color_(color) {} // age, color 和类的属性定义的顺序相同
}
Loading Comments...