首页 > 其他分享 >类的三大特性(封装、继承、多态)

类的三大特性(封装、继承、多态)

时间:2024-11-06 18:20:13浏览次数:3  
标签:封装 子类 pro father 多态 pub son include 三大

1.封装:

封装是指将数据(属性)和行为(方法)捆绑在一起,形成一个对象,并通过公共接口来访问这个对象。封装的目的是保护对象的内部状态,防止外部直接访问和修改对象的数据,确保数据的完整性和程序的安全性。

封装的意义:

1.将属性和行为作为一个整体,表现在生活中的事物

2.将属性和行为加以权限控制

封装的意义一:

在设计类的时候,属性和行为写在一起,表现事物

语法:

class+类名+{访问权限:属性/行为};

例如:设计一个圆类,求圆的周长

#include<iostream>
using namespace std;
class circle {
public://访问权限:共有的权限
    int r;
    double zhouchang() {
        return 2 * 3.14 * r;
    }
};
int main() {
    circle c1;//通过圆类,创造圆的对象,c1是一个具体的圆
    c1.r = 10;
    cout << "周长为:" << c1.zhouchang() << endl;
    return 0;
}

封装意义二:

类在设计是,可以把属性和行为放在不同的权限下,加以控制

3种访问权限:

1.public 公有权限

2.protected 保护权限

3.private 私有权限

#pragma once
#include<iostream>
#include<vector>
#include<string>//c++中使用字符串使用的是string类
using namespace std;
class A {
    int q;//私有成员:类的默认权限是私有的
public://共有权限:类内(类内的成员函数内访问),子类,对象访问(通过“.”访问)
    int pub;
protected://受保护的:类内访问,子类访问
    int pro;
private://私有的:只能在类内访问
    int pri = 1;//类内可初始化
    //pri=1;但不能赋值;
    void fun() {//类内访问
        pub = 1;
        pro = 2;
        pri = 3;
    }
};
int main() {
    A a;
    //类外通过“.”访问。
    a.pub = 3;
    //a.pro=2;受保护成员只能在类内和子类中访问
    //a.pri=1;私有成员只能在类内访问
}

2.继承

继承是允许新的类(子类)继承一个现有类(父类)的属性和方法。继承促进了代码的复用和模块化,通过继承一个基类,子类可以继承基类(父类)的所有特性,同时还可以添加新的特性或者覆盖基类中的方法。

#include<iostream>
#include<unordered_map>
using namespace std;
class A   //A父类、基类{
public:
    int num;
    void fun()    {
           cout << "A fun" << endl;    }};//继承就是通过已经存在的类创建新的类
class B :public A   //B子类、派生类{};
int main(){
    B b;
     b.num = 2;
     b.fun();
        return 0;
        }

继承的好处:

减少重复的代码

继承方式:priivate,protected,public

1.private

注意:

凡是基类(父类)中私有的,派生类都不可以访问(会继承下来,但不能访问)

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class father{
private:
    int pri;
    protected:
     int pro;
     public:
     int pub;
            };
//以私有的方式继承父类,父类中的所有成员在子类中的权限都是私有的
class son : private father  //son继承了类father,father中包含的 son中也包含
{
    void fun()  {
    //pri = 1; 报错,因为 pri在father中是私有的所以不能再子类中访问        
    pro = 1;       
    pub = 1;    }
     };
   //因为son以私有的方式继承了father,所以father中的成员在son中都是私有的,所以son的子类 grandson 不能访问 pro和pub
   class grandSon :public son{    
   void fun(){
      pro = 1; 
      pub = 1;   
      }
     }​

2.protected

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class father{
private:    
int pri;
protected:    
int pro;
public:   
int pub;
};
//公有的方式继承father,pri仍然不可访问,pro仍然是受保护的,pub仍然是公有的
class son : public father  //son继承了类father,father中包含的 son中也包含{
    void fun(){
    //pri = 1; 报错,因为 pri在father中是私有的所以不能再子类中访问        
    pro = 1; //pro在son中仍然是受保护的      
    pub = 1;//pub在son中是公有的    
    }
    };
    class grandson :public son{    
    void fun(){        
    //因为pro是受保护的所以可以在grandson中访问       
    //因为pub是公有的的所以可以在grandson中访问       
     pro = 1;
    pub = 1;    
    }
    };
    int main(){    
    son s; 
    s.pro = 2;//因为pro和pub是受保护的所以不可以通过对象访问,会报错    
    s.pub = 2;//因为pub是公有的的所以可以通过对象访问    
    return 0;
    }

3.public

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class father{​
private:    
int pri;
protected:   
int pro;
public:
 int pub;
 };
 //公有的方式继承father,pri仍然不可访问,pro仍然是受保护的,pub仍然是公有的
 class son : 
 public father  //son继承了类father,father中包含的 son中也包含{    
 void fun(){  
 //pri = 1; 报错,因为 pri在father中是私有的所以不能再子类中访问       
  pro = 1; //pro在son中仍然是受保护的        
  pub = 1;//pub在son中是公有的    
  }
  };
  class grandson :public son{    
  void fun(){ 
  //因为pro是受保护的所以可以在grandson中访问        
  //因为pub是公有的的所以可以在grandson中访问        
  pro = 1;
  pub = 1;
  }
  };
  int main(){    
  son s;
   //s.pro = 2;报错,因为pro和pub是受保护的所以不可以通过对象访问,会报错    
   s.pub = 2;//因为pub是公有的的所以可以通过对象访问    
   return 0;
   }

在继承中,先调用父类构造函数,再调用子类构造函数,析构顺序与构造相反

在继承中,父类和子类共享同一个静态成员变量

3.多态:

   多态性指的是同一个行为具有多个不同表现形式的特性。在面向对象编程中,多态性常用于实现接口或继承父类的对象,这样不同的子类对象就可以用相同的接口来调用其独特的方法。这使得程序设计更加灵活,可以对不同的数据类型进行统一处理。

多态的基本基本条件:有函数重写

函数重写:

子类重新定义父类中有相同名称,返回值和参数的虚函数,主要在继承关系中出现。重写的函数和被重写的函数必须都为virtual函数,并分别位于基类和派生类中,如果父类被重写的函数加了vritual,子类继承父类,那么子类重写的函数加不加vritual都是虚函数重写的函数和被重写的函数,返回值,函数名和函数参数必须完全一致;

#include<iostream>
using namespace std;
class father{
public:    
virtual void fun(){       
cout << "father" << endl;    
}
};
class child:public father{
public:    
virtual void fun(){        
cout << "child" << endl;    
}
};

多态分为静态多态和动态多态

1.静态多态:

函数重载 和 运算符重载属于静态多态,复用函数名

2,动态多态:

派生类和虚函数实现运行时多态

二者区别:

静态多态的函数地址早绑定 :编译阶段确定函数地址

动态多态的函数地址晚绑定 :运行阶段确定函数地址

多态的基础: 需要有重写,子类重写父类的 返回值 名字 参数相同的虚函数,(只要父类的函数是虚函数即可)。

动态多态: 父类的指针或引用指向子类对象,并且通过该指针或引用调用子类重写的虚函数

多态的使用条件: 父类的指针或引用指向子类对象

#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Animal{
    public:
    virtual void speak() {
     cout << "anima speak" << endl;
      }    
  void work(){ 
  cout << "anima work" << endl;  
  }
};
class cat :public Animal{
public:   
     void speak(){
      cout << "cat speak" << endl;
  }
  void work(){
          cout << "cat work" << endl;
          }
      };
class dog :public Animal{
   public:    
      void speak(){        
      cout << "dog speak" << endl;    
      }    
      void work(){       
       cout << "dog work" << endl;
       }
       };
       int main() {    
       Animal *a = new dog;
       //speak 是函数重写 ,work是函数隐藏
        a->speak();//调用的是dog里的speak函数   
        a->work();//调用的函数是隐藏函数时,调用函数的指针或对象是什么类型调用哪里的函数,调用的是animal里的work函数  
        return 0;
        }

标签:封装,子类,pro,father,多态,pub,son,include,三大
From: https://blog.csdn.net/2401_88249494/article/details/143493825

相关文章

  • C++:多态中的虚/纯虚函数,抽象类以及虚函数表
    我们在平时,旅游或者是坐高铁或火车的时候。对学生票,军人票,普通票这些概念多少都有些许耳闻。而我们上篇文章也介绍过了继承与多继承。如果这些票我们都分别的去写一个类,当然很冗余,这里我们便可以去使用继承,我们假设我们的票价是由一个票价函数控制的,如果子类与父类中有着同名的......
  • Python 继承、多态、封装、抽象
    面向对象编程(OOP)是Python中的一种重要编程范式,它通过类和对象来组织代码。OOP的四个核心概念是继承(Inheritance)、多态(Polymorphism)、封装(Encapsulation)和数据抽象(DataAbstraction)。下面将详细介绍这四个概念。继承(Inheritance)继承是面向对象编程(OOP)的一个基本概念,它允......
  • C语言字符数组 java封装
    1.intmain(void){   inta[5]={1,3,5,7,9};   charstrl[5]={'A','B','C','D','E'};   charstr2[5]="ABCD";//不能是ABCDE,最后还有\0   inti=0;   //for(i=0;i<5;i++)   //{ ......
  • 编程中的多态
    编程中的多态编程语言中,多态是一个非常重要的概念。本文将详细介绍多态的定义、其背后的思维模式、以及在C++和Java中的具体实现方法。1.在编程中,多态指的是什么?多态(Polymorphism)源于希腊语,意为“多种形态”。在编程中,多态指的是一种能够通过统一的接口来操作不同类型的......
  • 0基础学Python装饰器封装、类成员与静态方法、魔术方法
    0基础学Python装饰器封装、类成员与静态方法、魔术方法装饰器封装类成员和静态方法实例属性和方法类属性和类方法静态方法使用场景魔术方法定义初始化与表示方法比较运算方法算术运算方法代码演示装饰器封装装饰器(decorators)是一种高阶函数,用于在不修改原有函数或......
  • C++ 中类的三大特性是什么?
    封装:封装是将数据和操作数据的方法捆绑在一起,形成一个类。通过封装,类的内部实现细节被隐藏起来,只对外提供公共的接口。这样做有以下几个好处:数据安全性:封装可以防止外部代码直接访问和修改类的内部数据,只能通过类提供的方法进行操作。这样可以保证数据的安全性和完整性,避免因......
  • APP获取用户的三大法则
    APP内容,提升APP吸引力和用户留存率A.用户研究深化1.**深入用户行为分析**:  -用户使用路径分析  -用户行为模式识别  -用户流失点分析2.**定性研究与定量研究结合**:  -进行深度访谈和焦点小组讨论  -利用数据分析用户行为3.**场景化研究**: ......
  • 使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理
    在开发桌面界面的时候,往往都需要对一些通用的窗体进行一些抽象封装处理,以便统一界面效果,以及继承一些通用的处理过程,减少重复编码。本篇随笔介绍使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理,介绍基于wx.lib.sized_controls.SizedDialog对话框类的基类封装,以便简化子......
  • 封装红黑树实现mymap和myset
    前面我们已经了解过红黑树如何实现,和map与set的基本用法;要继续深入了解map,set中的库函数的用法,与细节那么我们就可以试着简单用语言封装模拟实现一下map与set; 这里就分享一下我的思路;若没了解过红黑树如何实现,和map与set的基本用法建议先去了解一下哦;我之前的文章中就有。......
  • 面向对象三大特征之一:封 装
    1、特点封装是面向对象的核心思想,两层含义:一是一个整体(把对象的属性和行为看成一个整体,即封装在一个对象种),二是信息隐藏,对外隐藏,但可以通过某种方式进行调用。2、访问权限(1)private:当前类访问级别,属于私有访问权限。(2)default:本包访问权限,一个类中的属性或方法没有任何访问权......