C++基础知识⼋股⽂
1、⾯向对象的三⼤特性:
继承、多态、封装:将具体的实现过程封装成函数,只能通过接⼝进⾏访问
2、什么是多态?多态如何实现?
多态:⽗类的指针指向⼦类的对象,通过⽗类指针调⽤实际的⼦类的成员函数。
实现:通过虚函数实现,虚函数的地址保存在虚函数表中,虚函数表的地址保存在含有虚函数的类的实例对象的内存空间中。
3、虚函数:virtual修饰的成员函数
纯虚函数:加上=0;例:virtual void show(int a) = 0;
如果⽗类定义虚函数,⼦类必须重写。
含有纯虚函数的类称为派⽣类;继承纯虚函数的派⽣类如果没有完全实现基类纯虚函数,依然是抽象类,不能实例化对象。
抽象类对象不能作为函数的参数,不能创建对象,不能作为函数返回类型。
可以声明抽象类指针,可以声明抽象类的引⽤。
⼦类必须继承⽗类的纯虚函数,并全部实现后,才能创建⼦类的对象。
4、虚函数和纯虚函数的区别?
1.虚函数和纯虚函数可以出现在同⼀个类中,该类成为抽象基类。
2.使⽤⽅式不⽤:虚函数可以直接使⽤,纯虚函数必须在派⽣类中实现后才能使⽤。
3.定义⽅式不同:虚函数的定义要在普通函数的基础上加上virtual关键字,纯虚函数定义时除了要加virtual,还要加=0。
4.虚函数必须实现,否则会报错。
5.析构函数最好定义为虚函数,特别是对于含有继承关系的类;析构函数可以定义为纯虚函数,此时其所在的类为抽象基类,不能创建对象。
5、虚函数实现多态的原理?
1.函数指针
2.⼀个由函数指针组成的虚函数列表vtable,以及⼀个具体指向哪个虚函数列表的虚函数指针vfptr,该指针指向虚函数的地址
3.调⽤虚函数,通过vfptr到对应的vtable,调⽤表⾥的函数指针,如果⼦类重写,表中的⼦类函数就会覆盖⽗类,调⽤的就是⼦类。也就是说⼦类继承⽗类的时候,可以这么理解,先把⽗类的虚函数列表复制⼀份作为⾃⼰的,然后如果⼦类重写⽗类就覆盖,没重写就保留,如果⼦类的函数⽗类没有,那就在虚函数列表加上。
析构函数的定义4.vtable每个类⼀个,编译期就存在,vfptr创建对象时就存在,每个对象⼀个
5.构造函数会在初始化列表初始化。
6.虚函数表和类绑定,虚表指针和对象绑定。什么意思?就是类的不同对象它们的虚函数列表都是相同的,但是每个对象都有⾃⼰的虚表指针,来指向类的虚函数列表。
转载:
声明:本次转载完全出于学习⽬的,如侵犯⽹站或答案原作者权益,请私信我,本⼈将最快速删除博客,并予以道歉。