多態計算器
普通計算器
#include <iostream>
using namespace std;
class Calculator
{
public:
void setv1(int v)
{
this->val1 = v;
}
void setv2(int v)
{
this->val2 = v;
}
int getResult(string oper)
{
if (oper == "+")
{
return val1 + val2;
}
else if (oper == "-")
{
return val1 - val2;
}
}
private:
int val1;
int val2;
};
void test01()
{
Calculator cal;
cal.setv1(10);
cal.setv2(10);
cout << cal.getResult("+") << endl;
cout << cal.getResult("-") << endl;
}
int main()
{
test01();
return 0;
}
運行
20
0
虛函數和純虛函數
虛函數
虛函數 是在基類中使用關鍵字 virtual 聲明的函數。在派生類中重新定義基類中定義的虛函數時,會告訴編譯器不要靜態鏈接到該函數。
我們想要的是在程序中任意點可以根據所調用的對象類型來選擇調用的函數,這種操作被稱爲動態鏈接,或後期綁定。
純虛函數
您可能想要在基類中定義虛函數,以便在派生類中重新定義該函數更好地適用於對象,但是您在基類中又不能對虛函數給出有意義的實現,這個時候就會用到純虛函數。
我們可以把基類中的虛函數 area() 改寫如下:
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
// pure virtual function
virtual int area() = 0;
};
= 0
告訴編譯器,函數沒有主體,上面的虛函數是純虛函數。
多態計算器
利用多態實現計算器
class abstractCalculator
{
public:
//虛函數 virtual int getResult(){ return 0; };
//純虛函數
//如果父類中有了 純虛函數 子類繼承父類,就必須要實現 純虛函數
//如果父類中 有了 純虛函數 ,這個父類 就無法實例化對象了
//這個類有了純虛函數,通常又稱爲 抽象類
virtual int getResult() = 0;
void setv1(int v)
{
this->val1 = v;
}
void setv2(int v)
{
this->val2 = v;
}
public:
int val1;
int val2;
};
//如果父類中有了 純虛函數 子類繼承父類,就必須要實現 純虛函數
class A :public abstractCalculator
{
public:
virtual int getResult()
{
return 0;
}
};
//加法計算器
class PlusCalculator :public abstractCalculator
{
public:
virtual int getResult()
{
return val1 + val2;
};
};
class SubCalculator : public abstractCalculator
{
public:
virtual int getResult()
{
return val1 - val2;
};
};
class ChengCalculator :public abstractCalculator
{
public:
virtual int getResult()
{
return val1 * val2;
};
};
void test02()
{
abstractCalculator* abc;
//加法計算器
abc = new PlusCalculator;
abc->setv1(10);
abc->setv2(20);
cout << abc->getResult() << endl;
delete abc;
abc = new SubCalculator;
abc->setv1(10);
abc->setv2(20);
cout << abc->getResult() << endl;
delete abc;
abc = new ChengCalculator;
abc->setv1(10);
abc->setv2(20);
cout << abc->getResult() << endl;
//如果父類有了純虛函數,不能實例化對象了
/*abstractCalculator aaa;
abstractCalculator * abc = new abstractCalculator;*/
}
運行
30
-10
200