C++ 三大特性是:封装,继承,多态

一、概念和优点

封装(encapsulation):封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过 外部接口,一特定的访问权限来使用类的成员。通过封装使一部分成员充当类与外部的接口,而将其他的成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。

继承:继承是面向对象软件技术当中的一个概念。如果一个类B继承自另一个类A,就把这个B称为A的子类,而把A称为B的父类。**继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。**在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。

多态(Polymorphisn):多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针多态性在C++中都是通过虚函数(Virtual Function)实现的虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”或者称为“重写”(override)。

二、封装

封装实际就是为类中的函数和变量设置访问权限。访问权限包括public,private,protect。其中类对象的默认访问控制权限为private。
(1)public(共有),所有类均可访问
(2)protected(保护),可以被自身和子类访问
(3)private(私有),只能自身和友元函数访问

说明:
(1)public成员可以在类外直接访问。
(2)protected和private成员在类外(在此将这两种限定符都可以看成是私有的,在继承出区别)不能够访问。
(3)它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止。
(4)class的默认访问权限是private,而struct为public型(因为struct要兼容C)。C++常用的是class
(5)类外:即脱离了类的作用域或者说访问时不在类的成员函数中。

三、继承

子类继承基类后,可以创建子类对象来调用基类函数,变量等。集成包括以下形式:
(1)单一继承:继承一个父类,这种继承称为单一继承,一般情况尽量使用单一继承,使用多重继承容易造成混乱易出问题(2)多重继承:继承多个父类,通过逗号进行分隔可以让派生类指定多个基类。例如 狗:public 哺乳动物,public 犬科动物

(3)菱形继承:多重继承掺杂隔代继承1-n-1模式,此时需要用到虚继承,例如 B,C虚拟继承于A,D再多重继承B,C,否则会出错
继承的代码表示为:

class Daughter : public Father
{
 public: 
  Daughter() {};
};

继承方式规定了如何访问继承的基类的成员。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限
继承权限:子类继承基类除构造和析构函数、基类的重载运算符、基类的友元函数以外的所有成员,继承可以扩展已存在的代码,目的也是为了代码重用。

另外,继承可分为接口继承和实现继承:
(1)普通成员函数的接口总是会被继承:  子类继承一份接口和一份强制实现
(2)普通虚函数被子类重写     :  子类继承一份接口和一份缺省实现
(3)纯虚函数只能被子类继承接口  :  子类继承一份接口,没有继承实现
访问权限图如下:

在这里插入图片描述

四、多态

C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。简单地说,多态意味着单个函数可以有多个不同的实现。
多态是基于虚函数来实现的。多态实现的两大条件为:
(1)调用函数的对象必须是指针或者引用。
(2)被调用的函数必须是虚函数,且完成了虚函数的重写。

#include <iostream>

class Person 
{
public:
    virtual void BuyTicket(int)
    {   
        std::cout << "Adult need Full Fare!" << std::endl;
    }   
};

class Child : public Person
{
public:
    virtual void BuyTicket(int)
    {   
        std::cout << "Child Free!" << std::endl;
    }   
};

void fun(Person& obj)
{
    obj.BuyTicket(1);                                                                                                                             
}

int main(void)
{
    Person p;
    Child c;

    fun(p);
    fun(c);

    return 0;
}


4.1 虚函数

虚函数是在函数前加了virtual的函数;纯虚函数是前面加了virtual,同时函数被=0的函数,纯虚函数不能被调用。
虚函数的底层原理可参考以下博客。
https://blog.csdn.net/zaishaoyi/article/details/101318044

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐