67 lines
1.5 KiB
C++
67 lines
1.5 KiB
C++
|
// 初尝多态
|
|||
|
#include <iostream>
|
|||
|
#include <cstring>
|
|||
|
#include <cstdlib>
|
|||
|
|
|||
|
using namespace std;
|
|||
|
|
|||
|
// 抽象类:
|
|||
|
// 至少有一个纯虚函数的类
|
|||
|
// 抽象类不能实现对象
|
|||
|
class AbstractCaculator // 定义计算器
|
|||
|
{
|
|||
|
protected: // 使用保护权限(目的是使子类可以访问,而其他类不可访问)
|
|||
|
int a, b;
|
|||
|
|
|||
|
public:
|
|||
|
void setA(int a) { this->a = a; }
|
|||
|
void setB(int b) { this->b = b; }
|
|||
|
|
|||
|
public:
|
|||
|
// 扩展功能,让子类去实现
|
|||
|
virtual int getResult() = 0; // 纯虚函数,声明函数并赋值为 0
|
|||
|
};
|
|||
|
|
|||
|
class AddCa : public AbstractCaculator
|
|||
|
{
|
|||
|
// 必须要去实现纯虚函数
|
|||
|
int getResult()
|
|||
|
{
|
|||
|
return a + b;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
class SubCa : public AbstractCaculator
|
|||
|
{
|
|||
|
// 必须要去实现纯虚函数
|
|||
|
int getResult()
|
|||
|
{
|
|||
|
return a - b;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// 多态的体现:
|
|||
|
// 1) 定义函数时,形参的类型为父类对象的指针
|
|||
|
// 2) 调用函数时,实参的类型为子类对象的指针
|
|||
|
int Result(AbstractCaculator *caculator, int a, int b)
|
|||
|
{
|
|||
|
caculator->setA(a);
|
|||
|
caculator->setB(b);
|
|||
|
return caculator->getResult();
|
|||
|
}
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
// 抽象类型不能去定义对象
|
|||
|
// error: cannot declare variable ‘a1’ to be of abstract type ‘AbstractCaculator’
|
|||
|
// AbstractCaculator a1;
|
|||
|
|
|||
|
AddCa *a2 = new AddCa;
|
|||
|
cout << Result(a2, 10, 20) << endl;
|
|||
|
cout << Result(new SubCa, 10, 20) << endl; // new SubCa 返回的是一个临时对象,不需要 delete
|
|||
|
delete a2;
|
|||
|
// delete new SubCa; // error: cannot delete expression of type ‘SubCa’
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|