- 0
- 0
- 约1.09万字
- 约 76页
- 2022-10-19 发布于广西
- 举报
void A::setA(int x) { a=x; } void B::setB(int x) { b=x; } void C::setC(int x, int y, int z) { //派生类成员直接访问基类的 //公有成员 setA(x); setB(y); c = z; } //其他函数实现略 int main() { C obj; obj.setA(5); obj.showA(); obj.setC(6,7,9); obj.showC(); // obj.setB(6); 错误 // obj.showB(); 错误 return 0; } * * . 2021/7/26 * 继承时的构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 定义构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。 派生类的构造函数需要给基类的构造函数传递参数 派生类的构造、析构函数 . 2021/7/26 * 单一继承时的构造函数 派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表) { 本类成员初始化赋值语句; }; 派生类的构造、析构函数 . 2021/7/26 * 单一继承时的构造函数举例 #includeiostream using namecpace std; class B { public: B(); B(int i); ~B(); void print() const; private: int b; }; 派生类的构造、析构函数 . B::B() { b=0; cout Bs default constructor called. endl; } B::B(int i) { b=i; cout Bs constructor called. endl; } B::~B() { cout Bs destructor called. endl; } void B::print() const { cout b endl; } * * . class C: public B { public: C(); C(int i, int j); ~C(); void print() const; private: int c; }; * * . C::C() { c = 0; cout Cs default constructor called. endl; } C::C(int i,int j): B(i) { c = j; cout Cs constructor called. endl; } C::~C() { cout Cs destructor called. endl; } void C::print() const { B::print(); cout c endl; } int main() { C obj(5, 6); obj.print(); return 0; } * * . 2021/7/26 * 多继承时的构造函数 派生类名::派生类名(参数表):基类名1(基类1初始化参数表), 基类名2(基类2初始化参数表), ...基类名n(基类n初始化参数表) { 本类成员初始化赋值语句; }; 派生类的构造、析构函数 . 2021/7/26 * 派生类与基类的构造函数 当基类中声明有缺省构造函数或未声明构造函数时,派生类构造函数可以不向基类构造函数传递参数,也可以不声明,构造派生类的对象时,基类的缺省构造函数将被调用。 当需要执行基类中带形参的构造函数来初始化基类数据时,派生类构造函数应在初始化列表中为基类构造函数提供参数。 派生类的构造、析构函数 . 2021/7/26 * 多继承且有内嵌对象时的构造函数 派生类名::派生类名(形参表):基类名1(参数), 基类名2(参数), ...基类名n(参数),新增成员对象的初始化 { 本类成员初始化赋值语句; }; 派生类的构造、析构函数 . 2021/7/26 * 构造函数的执行顺序 1. 调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 2. 对成员对象进行初始化,初始化顺序按照它们在类中声明的顺序。 3.执行派生类的构造函数体中的内容。 派生类的构造、析构函数 . 2021/7/26 * 拷贝构造函数 若建立派生类对象时没有编写拷贝构造函数,编译器会生成一个隐含的拷贝构造函数,该函数先调用基类的拷贝构造函数,再为派生类新增的成员对象执行拷贝。 若编写派生类的拷贝构造函数,则需要为基类相应的拷贝构造函数传递参数
原创力文档

文档评论(0)