C++ 面向对象三大特征总结(详解)

1.面向对象的三大特征

1).封装

	封装:将一个对象的全部的属性变量和行为方法进行包装(集中到一个类中,),
		 并用权限对其成员属性和成员方法加以限制,使得外部对其访问时,不能随意改变该包装.

#include 
using namespace std;

class Shape{
private:
    int x;//重心的横坐标
    int y;//重心的纵坐标
public :
    Shape(int x = 0,int y =0):x(x),y(y){}
    ~Shape(){}
public :
    void setX(int x){
        this->x = x;
    }
    void setY(int y){
        this->y = y;
    }
    int getX(){
        return x;
    }
    int getY(){
        return y;
    }
    friend ostream &operator<<(ostream &os, const Shape &s);
    /*
        在C++中cout其实是一个输出类的对象,我们可以通过将ostream类声明为Shape的友元函数,
        这样ostream可以任意访问Shape类中的成员,且不用考虑权限的问题
    */
};

ostream& operator<<(ostream& os,const Shape &s){
    return os << s.x << ","<<s.y << endl;
} 

int main(){
    Shape s;//构造了一个对象,供外部使用
    //s.x = 1; //无法直接修改,在类中,该成员属性权限为private私有的,无法在类外访问.
    s.setX(20); //我们可以通过调用类中允许类外访问权限public的setX()对其进行修改
    cout << s;
    return 0;
}

2).继承

继承:有了继承大大提供了代码的复用,子类继承父类,那么可以根据继承权限来访问父类中的成员.
#include 
using namespace std;

class Shape{
private:
    int x;//重心的横坐标
    int y;//重心的纵坐标
    static int z;
public :
    Shape(int x = 0,int y =0):x(x),y(y){}
    ~Shape(){}
public :
    void setX(int x){
        this->x = x;
    }
    void setY(int y){
        this->y = y;
    }
    int getX(){
        return x;
    }
    int getY(){
        return y;
    }
    
    int getZ(){
        return z;
    }
    
    friend ostream &operator<<(ostream &os, const Shape &s);
    /*
        在C++中cout其实是一个输出类的对象,我们可以通过将ostream类声明为Shape的友元函数,
        这样ostream可以任意访问Shape类中的成员,且不用考虑权限的问题
    */
};

ostream& operator<<(ostream& os,const Shape &s){
    return os << s.x << ","<<s.y << endl;
} 


class Circle: public Shape{ //以public 的方式继承父类
private:
    int r;
    static float PI;
public :
    Circle(int x = 0,int y=0,int r=0):Shape(x,y),r(r){}
    ~Circle(){}
public :
    float getArea(){
        return PI * r * r;
    }
    float getGirth(){
        return 2 * PI * r;
    }
};

int Shape::z = 20;
float Circle::PI = 3.14;

int main(){
    Shape s;//构造了一个对象,供外部使用
    //s.x = 1; //无法直接修改,在类中,该成员属性权限为private私有的,无法在类外访问.
    s.setX(20); //我们可以通过调用类中允许类外访问权限public的setX()对其进行修改
    cout << s;
    cout << "-----------------" << endl;
    Circle c(1,1,2);
    cout << c;  //这里涉及到一个基类子对象的知识,
/*
    父类继承了子类中的成员属性,那么子类中就拥有了父类中类型成员
    ,我们将在子类中父类拥有的成员称之为基类子对象.

    由于在子类中拥有基类子对象,那么基类中的友元函数可以访问,可以通过子类对象来实现.
    但是基类的友元函数不能访问子类中独有的成员.
*/

    cout << c.getX() << endl;   //以public方式继承父类的getX()方法,可以直接访问
    cout << c.getArea() << endl;    //子类同时也可以拓展自己的方法
    cout << c.getGirth() << endl;
    cout << c.getZ() << endl;
    /*
        子类可以不断扩张自己的功能来丰富各种各样的需求,且子类只需要继承父类,
        继承那些共通的方法,而不是重新写一遍,大大提高了代码的复用.
    */
    return 0;
}

3).多态

多态:当子类继承多个父类是,如果存在一个相同的成员方法,那么是调用哪个父类中的成员方法,就会发生歧义,
	且若子类中也存在同名的,但我想调用父类的成员方法,也会发生歧义.
使用条件:	1.子类父类中同名的成员方法,则父类中的同名的成员的方法必须声明为virtual;
				2.必须定义一个左值是父类的指针或者引用来,右值为子类.

你可能感兴趣的:(笔记,归纳总结,c++)