大家好,我是情报小哥!
本系列C++教程可以说小哥是以最简洁的方式跟大家讲解了,主要面向的嵌入式软件开发(如QT)的朋友们,认真看完入个门问题不大。
前面跟大家分享了一下C++继承的语法与使用,不过还是有三点值得大家注意一下,并以此文说明。
相对于C语言而言,C++语法知识真的挺多的,不过学过一门编程语言的朋友都知道,在我们平时的开发过程中并不是一定要精通编程语言的几乎所有的编程语法和知识才能进行开发。
同样对于C++也是一样的,即使你花了很长的时间去把所有的C++语法知识都过了一遍,然而当你长时间不去使用,也会很容易忘记。
所以小哥这里讲的都是常用的一些语法知识,而不常见或者比较高级的知识暂时不深入,其实等我们真正深入到项目实战中再回过头来研究那一部分语法与使用也不迟的。
今天主要是跟大家分析三个关于继承容易混淆的知识点。
那我们直接来看一个例子:
1#include
2#include
3using namespace std;
4
5class Parent
6{
7public:
8 int Value;
9
10 Parent(int val)
11 {
12 Value = val;
13 }
14
15 int GetValue(void)
16 {
17 return Value;
18 }
19};
20
21class Child :public Parent
22{
23public:
24
25 int Value;
26
27 Child(int childval,int parentval):Parent(parentval)
28 {
29 Value= childval;
30 }
31
32 int GetValue(void)
33 {
34 cout<<"Parent::Value: "<<Parent::Value<<endl;
35 return Value;
36 }
37
38};
39
40int main(void)
41{
42
43 Child child(5,10);
44
45 cout<<"Value :"<<child.GetValue()<<endl;
46 cout<<"Value :"<<child.Parent::GetValue()<<endl;
47
48 cout<<"Value : "<<child.Value<<endl;
49 cout<<"Value : "<<child.Parent::Value<<endl;
50
51 cout<<"helloC++"<<endl;
52}
相对上面的运行结果也很明显了:
1、子类与父类的同名数据和方法成员是不同的,分别占据着不同的空间,且相互独立。
2、通过作用域(如Parent::)的方式作用于同名的成员,即可通过子类对象访问父类的成员,否则仍然访问的是子类成员,小哥之前也讲过命名空间,使用的方法类似。(对于C语言也有命名空间c++继承,你可以搜索了解下~)
前面小哥讲解过c++继承,如果是继承关系,那么首先调用父类的构造,然后调用子类的构造,那如果子类中有其他类的成员这些构造函数和析构函数如何处理呢?来一段代码即可说明该问题:
1#include
2#include
3using namespace std;
4
5class Parent
6{
7public:
8
9 Parent(void)
10 {
11 cout<<"Parent构造"<<endl;
12 }
13
14 ~Parent(void)
15 {
16
17 cout<<"Parent析构"<<endl;
18
19 }
20
21};
22
23class Other
24{
25
26public:
27
28 Other(void)
29 {
30 cout<<"Other构造"<<endl;
31 }
32
33 ~Other(void)
34 {
35 cout<<"Other析构"<<endl;
36 }
37};
38
39
40class Child :public Parent
41{
42public:
43 Other other;
44
45 Child(void)
46 {
47 cout<<"Child构造"<<endl;
48 }
49
50 ~Child(void)
51 {
52 cout<<"Child析构"<<endl;
53 }
54};
55
56int main(void)
57{
58 Child child;
59
60 cout<<endl<<"*****helloC++*****"<<endl<<endl;
61}
其实假如我们原本没有接触过这块的知识,也基本上可以想到C++会如何处理,首先处理继承父类的构造;然后处理成员类构造;最后处理自身构造;析构与构造函数形成堆栈的方式,上面的程序运行结果与我们的猜想是一致的。
这也就说明不是什么知识都一遍一遍的造轮子的,一通百通~
这句话如果是对于玩过C语言面向对象设计的伙计应该非常能够好理解,采用继承的方式,其子类结构体可以直接赋值给父类结构体指针,并使用父类的处理,所以子类仅仅只是父类的一种扩展和升级。
所以在C++中,子类对象可以直接初始化父类对象,也可以被父类指针指向,可以直接看成父类来使用即可。
来用代码来体会一下这句话:
1#include
2#include
3using namespace std;
4
5class Parent
6{
7public:
8
9 int Value;
10
11 Parent(int val):Value(val)
12 {
13 cout<<"Parent构造"<<endl;
14 }
15
16 ~Parent(void)
17 {
18 cout<<"Parent析构"<<endl;
19 }
20};
21
22class Child :public Parent
23{
24
25public:
26
27 int Value;
28
29 Child(int val,int parentval):Parent(parentval),Value(val)
30 {
31 cout<<"Child构造"<<endl;
32 }
33
34 ~Child(void)
35 {
36 cout<<"Child析构"<<endl;
37 }
38};
39
40int main(void)
41{
42
43 Child child(1,2);
44
45 Parent parent(3);
46
47 Parent* ptrParent;
48
49 cout<<"parent.Value1:"<<parent.Value<<endl;
50
51 parent = child;
52 cout<<"parent.Value2:"<<parent.Value<<endl;
53
54 ptrParent = &child;
55 cout<<"parent.Value3:"<Value<<endl;
56
57
58 Parent& ParentTag = child;
59 cout<<"parent.Value4:"<<ParentTag.Value<<endl;
60
61 cout<<endl<<"*****helloC++*****"<<endl<<endl;
62}
从上面的代码和运行结果可以发现,子类对象可以当作父类对象来使用,并且其相关数据和方法都来自于初始化的子类中的父类。
最 后
这里小哥就介绍了一下C++中三个继承易混淆点,希望本文能够对你有帮助,该系列还会持续更新,大家可以持续关注~
小哥搜集了一些嵌入式学习资料,公众号内回复”1024″即可找到下载链接~
推荐好文点击蓝色字体即可跳转
☞
☞
☞
☞
☞
☞
☞
限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688