C++三大特性

#何为抽象类:
1.  在C++中,含有纯虚函数的类称为抽象类,它不能生成对象,且不能实例化对象,但是可以实例化指针;
2.  纯虚函数:virtual void lock()=0;若没有=0,则为一个虚函数
3. 实例化:在面向对象的编程中,把用“类创建对象的过程”称为实例化;将一个抽象的概念类,具体到该类实物的过程
         形式:类名 对象名=new 类名(参数1,参数2……)构成

C++三大特性
封装:
 1.目的是为了增强安全性和简化编程,用户只需要通过外部接口以及特定的访问权限来使用类的成员
 注意:::友元函数不是类的成员函数,相当于给类开了一个后门,可以访问其私有成员,破坏了其封装性,但是提高了程序的运行效率;
 
继承:
派生类把基类的所有成员都继承过来了,除了构造函数和析构函数
   1.使代码可以复用
   2.三个继承方式:public  protect private
   3.基类对象和派生类对象赋值转换
     1)派生类对象可以赋值给基类的对象/指针/引用,但基类的对象不能赋值给派生类对象;基类的指针可以通过强制类型转换赋值给派生类的指针,但是基类的指针必须是指向派生类对象时才是安全的;
   4.派生类的默认成员函数
   . 1) 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的“初始化列表阶段”显示调用。
     2) 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。
     3) 派生类的operator=必须要调用基类的operator=完成基类的复制。 
     4) 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类 对象先清理派生类成员再清理基类成员的顺序。即派生类对象析构清理先调用派生类析构再调基类的析构 
     5) 派生类对象初始化先调用基类构造再调派生类构造。
     
   5.”隐藏“(重定义)---子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问;在子类成员中可以用基类::基类成员来显示访问;
   6.友元关系不能被继承,也就是说基类友元不能访问子类私有和保护成员
   7.解决菱形继承二义性和冗余问题
   ----1)访问明确化,如d.A::_name
       2) 虚拟继承
       
![虚拟继承代码](https://img-blog.csdnimg.cn/20190816184119769.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0ODQwMDQ2,size_16,color_FFFFFF,t_70)

多态:通俗来说就是多种形态,具体点就是完成某个行为,当不同的对象区完成时会产生不同的状态
多态:分为动态多态和静态多态
      静态多态:在编译期间的行为。例如函数重载
      动态多态:在程序运行期间

  1.可以使用户以相同的方式处理不同类型的对象;举个例子--买票,小孩半票,大人全票,军人优先
  
  2. 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为
  3. 构成多态的条件:
      1)必须通过基类的指针或者引用调用虚函数
      2)被调用的函数必须是“虚函数”,且派生类必须对基类的虚函数进行“重写”
  

虚函数的重写(覆盖):
  1)派生类中有一个跟基类“完全相同”的虚函数(返回值类型,函数名字,参数列表完全相同),称子类的虚函数重写了基类的虚函数
虚函数重写的两个例外:
  1)协变-----派生类重写基类虚函数时,与基类虚函数“返回值类型不同”,即基类虚函数返回基类的指针或引用,派生类返回派生类的指针或引用
  代码如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190816164956692.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0ODQwMDQ2,size_16,color_FFFFFF,t_70)

  2)  析构函数重写----基类与派生类的析构函数的名字不一样,如果基类的析构函数为虚函数,此时派生类只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190816170151695.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0ODQwMDQ2,size_16,color_FFFFFF,t_70)

C++11中override和final
  1) final:修饰虚函数,表示该虚函数不能再被继承
  一般形式: virtual void Drive() final {}
  2)override: 检查派生类是否重写了基类某个虚函数。如果没有重写,则报错
  一般形式:virtual void Drive() override {}

重载,重写(覆盖),重定义(隐藏)的区别:
1.重载:两个函数在同一作用域
       功能类似的“同名函数”,这些同名函数的“形参列表”(参数个数/类型/顺序)必须不同
2.重写:两个函数分别在基类和派生类的作用域
       两个函数必须是一模一样的虚函数
3.重定义:两个函数分别在基类和派生类的作用域
         函数名相同,简单来说,如果两个基类和派生类的同名函数不构成重写就是重定义
面试中与C++三大特性相关的问题通常指的是封装、继承和多态。封装是将数据和操作封装在一个类中,通过访问权限控制来保护数据,实现了数据的隐藏和封装。继承是一种面向对象编程的关键特性,允许一个类继承另一个类的属性和方法。多态是指同一操作作用于不同的对象,可以有不同的行为。下面我将分别讨论这三个特性。 封装是C++的一个重要特性,它通过将数据和操作封装在一个类中,提供了数据的隐藏和封装。通过访问权限控制,我们可以将一些私有数据隐藏起来,只允许通过类的公有接口进行访问。这样可以保护数据的完整性和安全性,同时也提供了更好的代码组织和维护。 继承是C++中的另一个重要特性,它允许一个类继承另一个类的属性和方法。通过继承,派生类可以获得基类的成员变量和成员函数,并且可以通过重写和扩展基类的方法来实现自己的功能。继承提供了代码复用和层次化设计的能力,同时也允许多态的实现。 多态是C++面向对象编程中的一个关键特性,它可以让同一个操作作用于不同的对象,产生不同的行为。多态通过虚函数实现,通过将函数声明为虚函数,派生类可以重写基类的方法,并通过基类的指针或引用调用派生类的方法。这样就可以根据对象的实际类型来决定调用哪个方法,实现了运行时的动态绑定。 综上所述,封装、继承和多态是C++面向对象编程中的三大特性。封装提供了数据的隐藏和封装,继承提供了代码复用和层次化设计的能力,多态实现了同一操作作用于不同对象的不同行为。这些特性在C++中广泛应用,是面试中常见的考点。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记得多喝热水…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值