1. 程式人生 > >一個例子告訴你什麼是封裝,繼承和多型(C++ 程式碼例項) (一)

一個例子告訴你什麼是封裝,繼承和多型(C++ 程式碼例項) (一)

add by WJB   date 2018/08/30

面向物件的三大特性:封裝,繼承和多型;

封裝:將事物擁有的屬性和動作隱藏起來,只保留特定的方法與外界聯絡。

繼承:子類可以擁有父類的屬性和方法;

多型:以說是“一個介面,多種實現”或者說是父類的引用變數可以指向子類的例項,被引用物件的型別決定呼叫誰的方法,但這個方法必須在父類中定義

定義五花八門,所以定義不重要,重在理解和應用,接下來我們通過例項來說明這三個特性;

如果面試官給你一個問題,請實現加、減、乘和除四個功能;

第一種最簡便的方法,三個特性一個也沒有體現……

//main.cpp

double PlusMethod(double param1,double param2)
{
   return   param1+param2;
}
double MinusMethod(double param1,double param2)
{
   return   param1-param2;
}
double MultyMethod(double param1,double param2)
{
   return   param1*param2;
}
double DividMethod(double param1,double param2)
{
    if(param2==0)
    {
       return 0;
    }

   return   param1/param2;
}
main()
{
  double result ;

  result =PlusMethod(2,3);

  result =MinusMethod(2,3);

  result =MultyMethod(2,3);

  result =DividMethod(2,3);
}

第二種方法,體現封裝的特性;封裝就是抽象出類,類含有屬性和方法

封裝的好處就是程式碼功能分離;程式碼清晰易讀;

我們封裝一個MyMath類

//MyMath.h
class MyMath
{
public:
	MyMath();
	~MyMath();
public:
	static double PlusMethod(double param1, double param2);
	static double MinusMethod(double param1, double param2);
	static double MultyMethod(double param1, double param2);
	static double DividMethod(double param1, double param2);
};
//MyMath.cpp
#include "MyMath.h"


MyMath::MyMath()
{
}


MyMath::~MyMath()
{
}

double MyMath::PlusMethod(double param1, double param2)
{
	return param1+ param2;
}

double MyMath::MinusMethod(double param1, double param2)
{
	return param1-param2;
}

double MyMath::MultyMethod(double param1, double param2)
{
	return param1*param2;
}

double MyMath::DividMethod(double param1, double param2)
{
	if (param2==0)
	{
		return 0;
	}
	return param1 / param2;
}

//main.cpp

#include "MyMath.h"

int main()
{
	double result;

	result = MyMath::PlusMethod(2, 3);

	result = MyMath::MinusMethod(2, 3);

	result = MyMath::MultyMethod(2, 3);

	result = MyMath::DividMethod(2, 3);
    return 0;
}

第三種方法:體現封裝和繼承

繼承的優勢是 程式碼複用高;

建立基類或者說父類 Operation  ;

注意:

1,基類的解構函式必須為虛擬函式

2,成員變數要初始化

//Operation.h
class Operation
{
public:
	Operation();
	virtual ~Operation();
	virtual void SetFirstNum(double param);
	virtual void SetSecondNum(double param);
protected: 
	double m_firstNum;
	double m_SecondNum;
};


//Operation.cpp
#include "Operation.h"

Operation::Operation():
	m_firstNum(0), m_SecondNum(0)
{
}

Operation::~Operation()
{
}

void Operation::SetFirstNum(double param)
{
	m_firstNum = param;
}

void Operation::SetSecondNum(double param)
{
	m_SecondNum = param;
}

接下來 創加減乘除四個類;這裡僅寫加和減兩個類,其餘兩個類相似。

加法類

//MyMinusFunc.h

#include "Operation.h"
class MyMinusFunc:public Operation
{
public:
    MyMinusFunc();
    ~MyMinusFunc();
    double GetResult();
};

//MyMinusFunc.cpp

#include "MyMinusFunc.h"


MyMinusFunc::MyMinusFunc()
{
}

MyMinusFunc::~MyMinusFunc()
{
}

double MyMinusFunc::GetResult()
{
    return m_firstNum - m_SecondNum;
}
減法類:

//MyPlusFunc.h

#include "Operation.h"
class MyPlusFunc:public Operation
{
public:
    MyPlusFunc();
    ~MyPlusFunc();
    double GetResult();
};
//MyPlusFunc.cpp

#include "MyPlusFunc.h"


MyPlusFunc::MyPlusFunc()
{
}

MyPlusFunc::~MyPlusFunc()
{
}

double MyPlusFunc::GetResult()
{
    return m_firstNum + m_SecondNum;
}
//main.cpp

#include "MyMath.h"
#include "MyPlusFunc.h"
#include "MyMinusFunc.h"

int main()
{
    double result;

    result = MyMath::PlusMethod(2, 3);

    result = MyMath::MinusMethod(2, 3);

    result = MyMath::MultyMethod(2, 3);

    result = MyMath::DividMethod(2, 3);
    MyMinusFunc minus;
    minus.SetFirstNum(3);
    minus.SetSecondNum(2);
    result=    minus.GetResult();

    MyPlusFunc plus;
    plus.SetFirstNum(3);
    plus.SetSecondNum(2);
    result = plus.GetResult();

    return 0;
}
這個例項很明白的說明了繼承的特性,程式碼複用也是顯而易見地;

這篇太長了  多型的特性在下篇講,請繼續關注……