《c++类、继承、多态》

一、类
1、类,是某一事物的本质提取,类的建立是事物抽象的过程。抽象的作用就是表示同一类事物的本质,类是对象的抽象,对像则是类的特例。对象,任何一个对象都有两个要素,即属性和行为,而c++中的对象都是由数据和函数构成的。封装,指两个方面的内容,一是,将有关的数据和操作代码封装在一个对象中,二是,将对象中的某些部分对外屏蔽,隐藏其内部实现细节,只留少量的接口。

3、面向对象的工程包括:面向对象分析(object oriented analysis OOA,从宏观的角度概括出系统应该做什么)、面向对象设计(object oriented design ,OOD,进行类的设计)、面向对象编程(object oriented programming oop,面向对象编程)

4、类中成员函数的存放方式,不同对象的数据存储单元中存放的数据值是不一样的,但是函数代码是相同的。C++采用单独的一段空间来存放这些共同的函数代码,在调用各对象的函数的时候,都去调用这个公用函数的代码。C++每个对象所占用的存储空间只是该对象的数据部分所占用的空间。

5、如果一个类的所有数据成员都是公用的则可以在定义类的时候进行初始化(初始化方法跟struct 相同)

     C++中的类提供构造函数对对象进行初始化,如果用户没有自己定义构造函数,c++系统会自动生成一个构造函数,函数体是空的什么也不做。可以在构造函数的体中对数据成员进行初始化,也可以使用初始化列表;

6、析构函数的作用不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作。先构造的后析构。

7、对象的指针,指向对象成员的指针,常对象不能调用该对象的非const 行的成员函数,常成员函数,只能引用本类的数据成员不能更改它的值。如果一定要修改某个常对象的某个数据成员的值,则需要将这个数据成员加上mutable 修饰,然后就可以用声明为const的成员函数来修改它的值。对象的常指针,常对象的指针。

8、对象的复制,是从无到有创建一个对象。而对象的赋值是对已有的对象赋值。

9、静态数据成员,不属于对象,静态数据成员在对象空间之外单独的分配空间,只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配内存,也可以被引用。静态数据成员在程序编译时被分配空间,到程序结束时才释放空间。即使没有定义类,也可用类名应用(公有的)静态数据成员,如果静态数据成员被定义成私有的,则只能通过公用的静态成员函数来引用。

10、友元函数与友元类:普通的函数在前面加上friend void show(Date&); 可以将某个类的成员函数声明为本类的友元函数,friend void Time::show(Date&); 或者将整个类声明为友元类,friend class Time;

   

二、类的继承

1、C++中的代码的可重用性是通过继承实现的。一个新类从已有的类那里获得其已有的特性,这种现象称为类的继承。派生类是基类的具体化,基类则是派生类的抽象。

    构造一个派生类,有一部分工作是从基类中接收成员。把基类的全部成员(除构造、析构、赋值运算符、拷贝构造)不能选择的全部继承过来;

2、派生类的构造函数,不仅要负责初始化本类的数据成员还要负责初始化基类的数据成员。

      当基类中有无参数的构造函数,可以不在派生类中显示的调用基类的构造函数。

     如果基类中只有有参数的构造函数,那么就需要在派生类的构造函数中显示的调用基类的有参构造函数。

    派生类的析构函数,调用基类的析构函数,先析构派生类的数据成员,再析构基类的数据成员。

3、多重继承,允许一个派生类同时继承多个基类。 调用基类的构造函数,跟继承顺序是一致的。

     多重继承产生的二义性,当连个基类中有同名函数的时候产生二义性,派生类中的函数跟基类的中的名字相同,参数类型,数目相同,就可以产生同名覆盖,而不会产生二义性。

           如果派生类的基类,又有相同的基类,那么就会在派生类中有两份函数,因此可以用虚基类的方式,保证派生类中有一份成员。定义虚基类的方式,class 派生类名:virtual 继承方式 基类名;

4、像int 可以赋值给double 类型,这种不同类型数据之间的自动转化和赋值,称为赋值兼容。基类和派生类中也有赋值兼容,派生类可以给基类对象赋值,在赋值时舍弃派生类自己的成员。

派生类对象可以代替基类对象的引用向基类对象的引用进行赋值和初始化。

三、多态

1、从系统实现的角度,多态性分为两类,静态多态性,和动态多态性,静态多态性,是通过函数重载和运算符重载实现的。动态多态性,是通过虚函数实现的。在一个类中是不能定义两个名字形同,形参个数和形参类型都相同的函数,否则就会出现重复定义,但是在不同的继承层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。

     虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类的指针或引用来访问基类和派生类中的同名函数。

C++规定,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动成为虚函数,可以加virtual 也可以不加。

2、纯虚函数的作用就是在这里声明一个虚函数,留在派生类中定义。含有纯虚函数的类是抽象类,不能定义对象。

3、多态的实现原理。

    为了实现多态,典型的编译器对每一个包含虚函数的类创建一个表(VTABLE),在VTABLE中放置特定类的虚函数地址,并且编译器秘密的在类中放置一个指针(vpointer),指向这个对象的VTABLE,为每个类设置VTABLE,初始化VPTR,为虚函数调用插入代码,所有这些都是自动发生的。每当创建一个包含有虚函数的类,或从包含有虚函数的类中派生一个类时,编译器就为这个类创建一个惟一的VTABLE,如果在这个派生类中没有对在基类中声明为virtual的函数进行重新定义,编译器就使用这个基类的虚函数地址。纯虚函数就是告诉编译器在VTABLE中为函数保留一个位置,但在这个特定位置中不放地址。只要有一个函数在类中声明为纯虚函数,则VTABLE就是不完整的。在构造函数中初始化VPTR的值,当调用基类的构造函数的时候,VPTR指向基类的VTABLE,如何还有更晚的派生类的构造函数被调用,则VPTR就指向这个派生类的VTABLE

为了调用派生类的析构函数,需要将基类的构造函数声明为虚函数这样派生类的析构函数就自动成为虚函数(即使基类和派生类的析构函数名字是不同的),如果将基类的析构函数定义为纯虚函数,就需要为基类的纯虚析构函数定义为空的函数体。因为在派生类的析构函数时会调用基类的析构函数。

4、为纯虚函数进行定义。

    在基类中对纯虚函数提供定义是可能的,当我们仍然高速编译器不允许产生抽象基类的对象。然而我们可能希望,一段公共地吗,使一些或所有派生类定义都能调用,而不必在每个函数中重复这些代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值