继承时,构造函数和析构函数的调用顺序

继承时,构造函数和析构函数的调用顺序

保证你们一篇看懂,不懂得可以留言!!!一定给你们讲明白!

  1. 先调用父类的构造函数,再初始化成员,最后调用自己的构造函数
  2. 先调用自己的析构函数,再析构成员,最后调用父类的析构函数
  3. 如果父类定义了有参数的构造函数,则自己也必须自定义带参数的构造函数
  4. 父类的构造函数必须是参数列表形式的
  5. 多继承时,class D: public Base2, Base1, Base的含义是:class D: public Base2, private Base1, private Base,而不是class D: public Base2, public Base1, public Base
  6. 多继承时,调用顺序取决于class D: public Base2, public Base1, public Base的顺序,也就是先调用Base2,再Base1,再Base。但是有虚继承的时候,虚继承的构造函数是最优先被调用的。
include <iostream>
using namespace std;

class Base{
public:
  Base(int d) : x(d){
    cout << "create Base" << endl;
  }
  ~Base(){
    cout << "free Base" << endl;
  }
private:
  int x;
};
class Base1{
public:
  Base1(int d) : y(d){
    cout << "create Base1" << endl;
  }
  ~Base1(){
    cout << "free Base1" << endl;
  }
private:
  int y;
};
class Base2{
public:
  Base2(int d) : z(d){
    cout << "create Base2" << endl;
  }
  ~Base2(){
    cout << "free Base2" << endl;
  }
private:
  int z;
};
class D: **public** Base2, **public** Base1, **public** Base{
public:
  D(int d):Base1(d), Base(d), Base2(d), b(d), b1(d), b2(d){
    //编译不过
    //Base1(d); //父类的构造函数必须是参数列表形式的                                                                     
    cout << "create D" << endl;
  }
  ~D(){
    cout << "free D" << endl;
  }
private:
  Base2 b;
  Base1 b1;
  Base b2;
};
int main(){
  D d(10);
}
执行结果:
create Base2                                                                         
create Base1                                                                         
create Base                                                                          
create Base2                                                                         
create Base1                                                                         
create Base                                                                          
create D                                                                             
free D                                                                               
free Base                                                                            
free Base1                                                                           
free Base2                                                                           
free Base                                                                            
free Base1                                                                           
free Base2     

更多C++相关知识体系,请移步C++知识目录

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++上机实验报告-实验五全文共7页,当前为第1页。C++上机实验报告-实验五全文共7页,当前为第1页。实验五 继承与派生 C++上机实验报告-实验五全文共7页,当前为第1页。 C++上机实验报告-实验五全文共7页,当前为第1页。 实验目的 1.学习定义和使用类的继承关系,定义派生类 2.熟悉不同继承方式下对基类成员的访问控制 3.学习利用虚基类解决二义性问题 实验要求 1.定义一个基类Animal,有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程尝试。 2.定义一个基类BaseClass,有整型变量Number,构造其派生类DerivedClass,观察构造函数析构函数的执行情况。 3.定义一个车(vehicle)基类,具有Maxspeed、Weight等成员,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNun)等属性。从bicycle和motorcar派生出摩托车(motorbicycle)类,在继承过程中,注意把vehicle设置为虚基类。如果不把vehicle设置为虚基类,会有什么问题?编程尝试。 实验内容及实验步骤 1.编写程序定义基类Animal,成员变量age定义为私有的。构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值,会出现类似以下的错误提示: error C2248 : 'age' : cannot access private member declared in class 'Animal' error C2248 : 'age' : cannot access private member declared in class 'Animal' 把age改为公有成员变量后重新编译就可以了。程序名:lab7_1.cpp。 2.编写程序定义一个基类BaseClass,构造其派生类DerivedClass,在构造函数析构函数中用cout输出提示信息,观察构造函数析构函数的执行情况。程序名:lab7_2.cpp。 3.用debug功能跟踪程序lab7_2的执行过程,观察基类和派生类的构造函数析构函数的执行情况。 4.编写程序定义一个车(vehicle)基类,由此派生出自行车(bicycle)类、汽车(motorcar)类,注意把vehicle派生为虚基类。再从bicycle和motorcar派生出摩托车(motorcycle)类,在main()函数中测试这个类。程序名:lab7_3.cpp。 编译成功后,把vehicle设置为非虚基类,再编译一次,此系统报错,无法编译成功。这是因为若不把vehicle设置为虚基类,会出现二义性错误,程序不能成功编译。 思考题 1.如何在已有的类的基础上设计新的类? 采用类的派生的方法,利用基类派生出子类,子类继承基类的属性,从而在已有基类的基础上设计新的派生类,模式如下: class 派生类名:继承方式 基类名1,继承方式 基类名2,…,继承方式 基类名n { 派生类成员声明; }; 2.基类和派生类对象的构造顺序是怎样的? 先调用基类的构造函数,然后再调用内嵌对象(派生类中的对象)的构造函数。基类构造函数调用顺序是按照派生类定义顺序,而内嵌对象的构造函数调用顺序是按照成员在类C++上机实验报告-实验五全文共7页,当前为第2页。C++上机实验报告-实验五全文共7页,当前为第2页。中声明的顺序。 C++上机实验报告-实验五全文共7页,当前为第2页。 C++上机实验报告-实验五全文共7页,当前为第2页。 3.如何利用虚基类解决二义性问题? 将共同基类设置为虚基类,语法为: class 派生类名:virtual 继承方式 基类名 源程序 Lab7_1.cpp #include<iostream> using namespace std; class Animal//Animal类 { /*private: int age;*/ public: int age; Animal(){} ~Animal(){} Animal(int ); }; class Dog:public Animal//Dog类,Animal的公有派生类 { private: int number; public: Dog(){} ~Dog(){} Dog(int,int); void setAge(int ); void showNumber(); void showAge(); }; Animal::A

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值