C++的三大特性:封装、继承和多态

参考:https://www.cnblogs.com/cxq0017/p/6490945.html

  • 封装

所谓封装,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。封装的目的是增强安全性和简化编程,使用者不低了解具体的实现细节,而只是通过外部接口以及特定的访问权限来使用类的成员。其中访问权限包括private、protected和public,private是私有,能够对外部和子类保密,除了成员所在的类本身可以访问之外,别的都不能直接访问。protected是保护,能够对外部保密,但允许子类直接访问这些成员。public是公开,就是说允许外部和子类直接访问这些成员。

例如,下面是一个动物类,我们把数据和功能封装起来

class Animal {

public://这就是公共成员,外部的接口

    void SetAnimalName(string strname);

    void ShowAnimalName();

private://这是私有成员,外部无法访问到

    string m_strName;

}

我们可以通过封装使一部分成员充当类与外部的接口,而将其他的成员隐藏起来,这样就限制了外部对成员的访问,也使不同类之间的相互影响度降低。

  • 多态

参考:http://www.cnblogs.com/cxq0017/p/6074247.html(举例很形象)

举一个例子,所有动物都有吃这个动作,猫猫,狗狗都是动物,也就都有吃这个动作,但动物基类中的吃不好定义,所以先只给出名字,然后在猫猫派生类中定义吃鱼,狗狗派生类中定义吃骨头,相同的吃操作,却体现了不同的行为,这就是多态。

用一句话概括,在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数,如果对象类型是基类,就调用基类的函数。

  1. 用virtual关键字声明的函数叫做虚函数,虚函数肯定是类的成员函数
  2. 存在虚函数的类都有一个一维的虚函数表,叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。虚表是可以继承的,若子类中未重写虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。
  3. 多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。
  4. 多态用虚函数来实现,结合动态绑定。
  5. 纯虚函数是虚函数再加上=0,
  6. 抽象类是指包括至少一个纯虚函数的类

    纯虚函数:由于基类不能确定该如何定义该虚函数,所以只定义了一个空的虚函数,具体的函数在子类中分别定义。也就是抽象类中的纯虚函数,在基      类中仅有名字,且必须在子类中实现这个函数。

  • 继承

参考:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html

扩展:虚基类https://blog.csdn.net/caomiao2006/article/details/4463664

继承(Inheritance)是类与类之间的关系,可以理解为一个类从另一个类获取成员变量和成员函数的过程。被继承的类成为父类或基类,继承的类称为子类或派生类,派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能

常用的三种继承方式有公有继承(public Inheritance)、私有继承(private Inheritance)、保护继承(protected Inheritance)。

先介绍一下public、private、protected的访问范围

  • private:只能被(1)该类中的函数,(2)其友元函数访问

不能被任何其他访问,该类的对象也不能访问

  • protected:可以被(1)该类中的函数,(2)子类的函数,(3)其友元函数访问

但不能被该类的对象访问

  • public:可以被(1)该类中的函数,(2)子类的函数,(3)友元函数,(4)该类的对象访问

注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类的所有成员函数。

下面列出三种不同的继承方式的基类特性和派生类特性

  public protected private
公有继承 public protected 不可见
私有继承 private private 不可见
保护继承 protected protected 不可见

上图中,

基类成员对派生类:公有成员和保护成员是可见的,私有成员是不可见的

基类成员对派生类的对象来说,要看基类的成员在派生类中变成了什么类型的成员。如私有继承时,基类的公有成员和保护成员都变成派生类的私有成员,因此对于派生类中的对象来说,基类的公有成员和保护成员就是不可见的。

进一步描述,

公有继承

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

基类的对象:可以访问基类中的公有成员

派生类的成员函数:可以访问基类中的公有成员和保护成员

派生类的派生类对象:可以访问基类中的公有成员

私有继承

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

基类的对象:可以访问基类中的公有成员

派生类的成员函数:可以访问基类中的公有成员和保护成员

派生类的对象:所有成员均不可见

基类的成员只能由直接派生类访问,而无法再往下继承

保护继承

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被他的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

访问权限与私有继承相同

猜你喜欢

转载自blog.csdn.net/summer00072/article/details/81169496