【Linux C++ 系列 】06 C++ OOP 面向对象

举报
jackwangcumt 发表于 2022/07/04 15:19:37 2022/07/04
【摘要】 OOP编程的核心特征是类+对象+继承+多态+消息的有机组合,OOP可以模拟人类处理问题的思维方式,使得软件的开发方法与过程与问题的解决方案在逻辑上尽可能一致,即OOP可以把客观世界中的实体抽象为编程语言中的对象,而对象可以用类进行实例化。类好比一个磨具,而对象就是用磨具构建的物体,是具体的对象。

1 OOP编程


     C++是一门面向对象的编程语言,所谓的面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构。OOP作为当前主流编程语言的一种特征,可以实现软件工程的3个主要目标:
    01)重用性;
    02)灵活性;
    03)扩展性。
     另外,OOP编程的核心特征是类+对象+继承+多态+消息的有机组合,OOP可以模拟人类处理问题的思维方式,使得软件的开发方法与过程与问题的解决方案在逻辑上尽可能一致,即OOP可以把客观世界中的实体抽象为编程语言中的对象,而对象可以用类进行实例化。类好比一个磨具,而对象就是用磨具构建的物体,是具体的对象。

2 OOP示例


     C++ OOP编程首先需要创建一个类,它是对象的抽象,其中包含各种属性,方法等来完成相关的操作。定义一个类,需要用关键字class来声明,同时,为了更好的对属性和方法进行封装,内部可以指定限定词(private为私有,public 为公有)来进行限定,这样可以控制类的实例对相关属性和方法进行访问。下面给出一个简单的C++面向对象的示例:

#include <iostream>
using namespace std;

namespace mycom{

    class Car{
        private :
            string color = "Red";
            string get_ver(){
                return "v1.0" ;
            } 

        public:
            Car(string color){
                this->color = color ;

            }
            float h = 1.5 ;
            void Drive(){
                cout << " Car Drive..." << endl ;
            }
            //内部声明
            string get_version();
            //内部声明
            void setH(float h);
            //内部声明
            string get_color();
           
    };
    
    //私有变量可以访问
    string Car::get_version(){
        return this->get_ver() ;
    }

} 

//外部实现
void mycom::Car::setH(float h){
     cout << " this->color -> " << this->color << endl ; 
     this->h = h ;
}
//外部实现
string mycom::Car::get_color(){
    return this->color ;
}

int main()
{

    mycom::Car car("Black") ;
    cout << " car.get_color() -> " << car.get_color() << endl ;  
    car.setH(1.9);
    cout << " car.h -> " << car.h << endl ;
    cout << " car.get_version() -> " << car.get_version() << endl ;  
    return 0;
}

       由上可知,class Car{  };定义了一个Car类,注意类定义的括号结尾需要用符号; 进行分割。私有变量放于private :下进行限定,而公有的放于public : 下。类中方法可以只给出声明而不给出实现细节,有点类似于接口。类的方法实现则可以在类外部进行实现,如string Car::get_version()
      类的实例化可以用 mycom::Car car("Black") ; 进行实现,这里不需要用new。对于实例化的对象car , 我们可以访问公有的属性和方法,而不能直接访问私有的属性和方法。编译后执行结果如下所示:

10.jpg

3 类继承示例


     C++ OOP编程可以基于基类进行继承,从而可以扩展功能,而且C++一次可以支持从多个基类进行继承。C++类的继承有多种模式,不同继承模型可访问的基类成员是有差异的。C++有3种继承模式:
     01)public 模式:基类的public 成员将在派生类中成为public 成员,基类的protected 成员将在派生类中成为protected 成员。
     02)  protected 模式:基类的public 成员和protected 成员都将在派生类中成为 protected成员 。
     03)  private 模式:基类的public 成员和protected 成员在派生类中都将private 私有成员 。
     下面给出一个简单的C++面向对象中的继承示例:

#include <iostream>
using namespace std;

namespace mycom{

    class A {

        public:
            int pub_x = 3;
        
        protected:
            int pro_y = 7;
        
        private:
            int pri_z = 21;
    };
    
    class B : public A {
        // pub_x is public
        // pro_y is protected
        // pri_z is not accessible  
        public:
            int get_x(){
              return this->pub_x;
            }  
            int get_y(){
              return this->pro_y;
            } 
            // int get_z(){
            //   return this->pri_z;
            // }
    };
    
    class C : protected A {
        // pub_x is protected
        // pro_y is protected
        // pri_z is not accessible  
        public:
            int get_x(){
              return this->pub_x;
            }  
            int get_y(){
              return this->pro_y;
            }       
    };
    // 'private' is default for classes
    class D : private A 
    {
        // pub_x is private
        // pro_y is private
        // pri_z is not accessible  
        public:
            int get_x(){
              return this->pub_x;
            }  
            int get_y(){
              return this->pro_y;
            } 
    };

} 


int main()
{

    mycom::A a ;
    cout << " a.pub_x -> " << a.pub_x << endl ;  
    //error: ‘int mycom::A::pro_y’ is protected within this context
    // cout << " a.pro_y -> " << a.pro_y << endl ;   

    mycom::B b ;

    // cout << " b.pub_x -> " << b.pub_x << endl ;  
    // cout << " b.pro_y -> " << b.pro_y << endl ;
    cout << " b.pub_x -> " << b.get_x() << endl ;    
    cout << " b.pro_y -> " << b.get_y() << endl ;   


    mycom::C c ;
    // cout << " c.pub_x -> " << c.pub_x << endl ;  
    // cout << " c.pro_y -> " << c.pro_y << endl ;
    cout << " c.pub_x -> " << c.get_x() << endl ;    
    cout << " c.pro_y -> " << c.get_y() << endl ;  

    mycom::D d ;
    // cout << " d.pub_x -> " << d.pub_x << endl ;  
    // cout << " d.pro_y -> " << d.pro_y << endl ;
    cout << " d.pub_x -> " << d.get_x() << endl ;    
    cout << " d.pro_y -> " << d.get_y() << endl ;  

    return 0;
}

 注意:基类中的私有成员不能在派生类中直接访问,而受保护的成员可以直接访问。
下面给出一个多继承的示例,如下所示:

#include <iostream>
using namespace std;

namespace mycom{

    class A {

        public:
            void show(){
               cout << this-> pri_z << endl; 
            }
        
        private:
            int pri_z = 21;
    };
    
    class B {
        private:
            int pri_z = 21;
        public:

            //void show(){
            //        cout << this-> pri_z << endl; 
            // }
            void show_sqrt(){
                   cout << this-> pri_z * 2 << endl; 
            }
    };
    
    class C : public A , public B {

    };
   
} 


int main()
{

    mycom::C c ;
    //request for member ‘show’ is ambiguous
    c.show();    
    c.show_sqrt(); 

    return 0;
}

 注意:从多个基类继承,如果基类中有重名(声明一致)的方法,则会出现歧义,例如C从A和B中进行继承,加入A和B中都有一个void show()方法,则C继承时抛出错误 。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。