C++虚函数原理和简单工厂模式

来源:互联网 发布:java爬虫验证码 编辑:程序博客网 时间:2024/06/08 18:26

1. 概述

现在有一个需求需要设计一个能够实现简单的加减乘除的计算器程序,最简单直接的想法就是使用下面的代码了:
std::string method_type;std::cout << "calc program is start,please input calc method type:" << std::endl;std::cin  >> method_type;std::cout << "please input calc num1:" << std::endl;double obj1(0), obj2(0);std::cin >> obj1;std::cout << "please input calc num2:" << std::endl;std::cin >> obj2;double result(0);if(method_type == "+"){    result = obj1 + obj2;}else if(method_type == "-"){    result = obj1 - obj2;}else if(method_type == "*"){    result = obj1 * obj2;}else if(method_type == "/"){    result = obj1 / obj2;}else{std::cout << "not valid input method!\n";} std::cout << "result is: " << result << std::endl;
诚然这样的代码简单直接,但是这样的代码它带来的可维护性、扩展性、代码复用率不高,因而是很有局限的。因而需要在此基础上对其进行封装和改进。下面就将讲到使用到的方法:继承和多态(它的原理将在下面说明)

2. 实现技术原理

请参考博文:C++虚函数实现原理

3. 编码

这里便是针对这个计算器的编码实现了,首先是main函数:
#include <stdlib.h>#include <stdio.h>#include <iostream>#include <string>#include "chapter1.h"int main(void){    std::string method_type;    std::cout << "calc program is start,please input calc method type:" << std::endl;    std::cin  >> method_type;    std::cout << "please input calc num1:" << std::endl;    double obj1(0), obj2(0);    std::cin >> obj1;    std::cout << "please input calc num2:" << std::endl;    std::cin >> obj2;    GetResult(method_type, obj1, obj2);    return 0;}
具体实现部分:
#pragma once#include <stdlib.h>#include <stdio.h>#include <iostream>//基类template<typename T> class BaseOpterator{public:    T m_result;public:    virtual void Calc(T obj1, T obj2)    {        this->m_result = 0;    }    void DisPlay()    {        std::cout << "result is: " << this->m_result << std::endl;    }};//派生出来的加法类template<typename T> class AddOpterator: public BaseOpterator<T>{public:    void Calc(T obj1, T obj2) override    {        this->m_result = obj1 + obj2;    }};//派生出来的减法类template<typename T> class SubOpterator: public BaseOpterator<T>{public:    void Calc(T obj1, T obj2) override    {        this->m_result = obj1 - obj2;    }};//派生出来的乘法类template<typename T> class MulOpterator: public BaseOpterator<T>{public:    void Calc(T obj1, T obj2) override    {        this->m_result = obj1 * obj2;    }};//派生出来的除法类template<typename T> class DevOpterator: public BaseOpterator<T>{public:    void Calc(T obj1, T obj2) override    {        this->m_result = obj1 / obj2;    }};//计算输入的数据template<typename T> GetResult(std::string method_type, T obj1, T obj2){    BaseOpterator<T>* base;    if(method_type == "+")    {        base = new AddOpterator<T>();    }    else if(method_type == "-")    {        base = new SubOpterator<T>();    }    else if(method_type == "*")    {        base = new MulOpterator<T>();    }    else if(method_type == "/")    {        base = new DevOpterator<T>();    }    else{std::cout << "not valid input method!\n";}    //得到计算结果    base->Calc(obj1, obj2);    base->DisPlay();    delete base;    base = nullptr;}

4. 参考资料

1. C/C++杂记:虚函数的实现的基本原理
2. C++ 中虚函数工作原理和(虚)继承类的内存占用大小计算

0 0