一個例子告訴你什麼是封裝,繼承和多型(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;
}
這個例項很明白的說明了繼承的特性,程式碼複用也是顯而易見地;
這篇太長了 多型的特性在下篇講,請繼續關注……