記事ディレクトリ
仮想機能と純粋な仮想機能
概念
まず、概念を強調する
関数を仮想関数として定義することは、その関数が実装されていない関数であることを意味するわけではありません。
彼を仮想関数として定義することは、基本クラスのポインターがサブクラスのこの関数を呼び出せるようにすることです。
関数を純粋な仮想関数として定義すると、その関数は実装されていません。
純粋な仮想関数を定義する目的は、インターフェイスを実装し、仕様として機能することです。仕様からこのクラスを継承するプログラマーは、この関数を実装する必要があります。
普通カウンター
普通カウンター
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;
}
多形計算機
実際の開発では、オープンとクローズの開発原則があります。
- 拡張可能
- 変更に近い
多形計算機コード
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//利用多态实现计算器
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;
}
int main() {
//test01();
test02();
system("pause");
return EXIT_SUCCESS;
}
その中で、virtual int getResult(){ return 0; };
は仮想関数でvirtual int getResult() = 0;
あり、純粋な仮想関数です。