c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数

一、

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6 class A
 7 {
 8 public:
 9     int a,b;
10     A();
11     A(int x,int y);
12     ~A();
13 };
14 A::A()
15 {
16     printf("调用A类构造函数\n");
17 }
18 A::A(int x,int y)
19 {
20     a=x;
21     b=y;
22     printf("调用A类构造函数\n");
23 }
24 A::~A()
25 {
26     printf("调用A类析构函数\n");
27 }
28 class B:public A
29 {
30 public:
31     int aa,bb;
32     B()
33     {
34         printf("调用B类构造函数\n");
35     }
36     B(int x,int y)
37     {
38         aa=x;
39         bb=y;
40         printf("调用B类构造函数\n");
41     }
42     ~B()
43     {
44         printf("调用B类析构函数\n");
45     }
46 };
47 class C:public B
48 {
49 public:
50     int aaa,bbb;
51     B one;
52     C(int x,int y)
53     {
54         aaa=x;
55         bbb=y;
56         one.aa=x;
57         one.bb=y;
58         printf("调用C类构造函数\n");
59     }
60     ~C()
61     {
62         printf("调用C类析构函数\n");
63     }
64 };
65 int main()
66 {
67     C first(0,0);
68     printf("%d %d %d %d\n",first.aaa,first.bbb,first.one.aa,first.one.bb);
69     return 0;
70 }

二、

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<algorithm>
  4 #include<iostream>
  5 using namespace std;
  6 class Base
  7 {
  8 public:
  9     Base(int x,int y)
 10     {
 11         a=x;
 12         b=y;
 13     }
 14     virtual void show()  //声明了虚函数,那么指针指向哪个对象就用那个对象的函数
 15     {     //否则的话,声明指针是什么类型就会用那个类型的函数
 16         cout<<"基类内容show打印"<<endl;
 17         cout<<"a:"<<a<<"b:"<<b<<endl;
 18     }
 19     void prinf()
 20     {
 21         cout<<"基类内容prinf打印"<<endl;
 22         cout<<"a:"<<a<<"b:"<<b<<endl;
 23     }
 24 private:
 25     int a,b;
 26
 27 };
 28 class One:public Base
 29 {
 30 public:
 31
 32     One(int x,int y):Base(x,y)
 33     {
 34         aa=x;
 35         bb=y;
 36     }
 37     void show()
 38     {
 39         cout<<"派生类内容show打印"<<endl;
 40         cout<<"aa:"<<aa<<"bb:"<<bb<<endl;
 41     }
 42     void prinf()
 43     {
 44         cout<<"派生类内容prinf打印"<<endl;
 45         cout<<"aa:"<<aa<<"bb:"<<bb<<endl;
 46     }
 47 private:
 48     int aa,bb;
 49 };
 50 int main()
 51 {
 52     Base mb(100,200),*pc;
 53     One mc(200,300);
 54     pc=&mc;
 55     pc->show();
 56     pc->prinf();
 57     pc=&mb;
 58     pc->show();
 59     pc->prinf();
 60     return 0;
 61 }
 62
 63 //2、
 64 #include<stdio.h>
 65 #include<string.h>
 66 #include<algorithm>
 67 #include<iostream>
 68 using namespace std;
 69 class Shape   //抽象类定义是只要里面有一个纯虚函数那他就是抽象类,
 70 {   //抽象类不需要什么关键字来定义,且它的派生类必须覆盖重写他的纯虚方法
 71 public :
 72     double a;
 73     Shape(double x)
 74     {
 75         a=x;
 76     }
 77     virtual void area()=0;
 78     virtual void show()=0;
 79 };
 80 class Circle:public Shape
 81 {
 82 public:
 83     Circle(double x):Shape(x)
 84     {
 85
 86     }
 87     void area()
 88     {
 89         cout<<"the circle area is :"<<endl;
 90         cout<<3.14*a*a<<endl;
 91     }
 92     void show()
 93     {
 94         cout<<"a:"<<a<<endl;
 95     }
 96 };
 97 int main()
 98 {
 99     Shape *ptr;
100     Circle r(6);
101     ptr=&r;
102     ptr->area();
103     ptr->show();
104     return 0;
105 }
106
107 //3、
108 #include<stdio.h>
109 #include<string.h>
110 #include<algorithm>
111 #include<iostream>
112 #include<typeinfo>
113 using namespace std;
114 class Sqare
115 {
116 public :
117     double a;
118     Sqare(double x)
119     {
120         a=x;
121     }
122 };
123 class Circle
124 {
125 public :
126     double a;
127     Circle(double x)
128     {
129         a=x;
130     }
131 };
132 int main()
133 {
134     Sqare one(1);
135     Circle two(2);
136     if(typeid(one)==typeid(Sqare))  //判断对象类型
137     {
138         cout<<"它是Sqare对象"<<endl;
139     }
140     else
141     {
142         cout<<"它是Circle对象"<<endl;
143     }
144
145     if(typeid(two)==typeid(Sqare))
146     {
147         cout<<"它是Sqare对象"<<endl;
148     }
149     else
150     {
151         cout<<"它是Circle对象"<<endl;
152     }
153     return 0;
154 }

原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11775093.html

时间: 2024-08-27 13:20:00

c++派生类中构造函数和析构函数执行顺序、判断对象类型、抽象类、虚函数的相关文章

对C++中派生类的构造函数和析构函数的认识

一:构造函数 形式:派生类名::派生类名:基类名1(参数1),基类名2(参数2),--基类名n(参数n),数据成员1(参数1),数据成员2(参数2),--数据成员n(参数n){ 各种操作的说明 } 执行过程:先执行基类的构造函数,再进行数据成员的赋值,最后执行函数体. 其中基类名和数据成员的顺序是由在派生类的定义中声明的顺序决定执行的顺序的,因此它们的顺序是任意的,但为了可读性,还是最好按顺序写. 如果基类只有默认构造函数,则基类名和参数表可以不用写出来. 二:复制构造函数 派生类的构造函数的形

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

C++:派生类的构造函数和析构函数

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

C++:派生类的构造函数和析构函数的调用顺序

一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: ? 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. ? 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 ? 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 ? 重写派生类的构造函数和析构函数

C++基类和派生类的构造函数和析构函数的调用

C++基类和派生类的构造函数和析构函数的调用 1.调用顺序 当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象.当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数. 所以,构造函数:基类->派生类:析构函数:派生类->基类. 示例: 1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 publi

派生类的构造函数和析构函数和多继承中的二义性与虚函数

析构函数主要作用是对数据成员初始化. 1派生类的构造函数 派生类的构造函数定义的一般形式为: 派生类名::派生类名(基类所需形参,本类成员所需形参):基类1(基类1 参数表),基类2(基类2 参数表),···,基类n(基类n 参数表),对象成员1(对象1 参数表),对象成员2(对象2 参数表),···,对象成员m(对象m 参数表){ //本类基本类型数据成员初始化 } 如果使用基类无参构造函数,派生类构造函数形参表中不包含供给基类构造函数的参数.此时,系统会调用基类的默认构造函数.如果使用对象数

c++, 派生类的构造函数和析构函数

1.构造函数与析构函数不会被继承:[1] 不是所有的函数都能自动地从基类继承到派生类中的.构造函数和析构函数是用来处理对象的创建和析构的,它们只知道对在它们的特殊层次的对象做什么.所以,在整个层次中的所有的构造函数和析构函数都必须被调用,也就是说,构造函数和析构函数不能被继承. 另外,operator= 也不能被继承,因为它完成类似于构造函数的活动. 2.派生类的构函数被调用时,会先调用基类的其中一个构造函数,因为在派生类的构造函数中用了初始化表的方式调用了基类构造函数,默认不写时是调用了基类中

c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)

測试源代码: //測试派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; } ~base() { cout<<"base destroyed!"<<endl; } };

派生类的构造函数与析构函数的调用顺序

派生类构造函数各部分的执行次序为1.调用基类的构造函数,按他们在派生类定义的先后顺序,顺序调用.2.调用成员对象的构造函数,按他们在类定义中声明的先后顺序,顺序调用3.派生类的构造函数体中的操作 在派生类构造函数中,只要基类不是使用缺省构造函数,都要显式给出基类名和参数表如果基类没有定义构造函数,则派生类也可以不定义,全部采用系统给定的缺省构造函数.如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数. //Test1.h #include<iostream> using names