多态练习/抽象函数

环境:ide:Mac+clion

视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

普通写法和多态写法实现计算器

这里涉及到一个开闭原则:对扩展开放,对修改关闭。
传统的写法:

class Caculator{
public:
    Caculator(int num1,int num2):m_Number1(num1),m_Number2(num2){
    }

    int getResult(char oper){
        switch (oper) {
            case '+':
                return m_Number1 + m_Number2;
                break;
            case '-':
                return m_Number1 - m_Number2;
                break;
            case '*':
                return m_Number1 * m_Number2;
                break;
            default:
                break;
        }
    }

private:
    int m_Number1;
    int m_Number2;

};

void test(){
    Caculator caculator(1,2);
    cout << caculator.getResult('+')<< endl;//3
    cout << caculator.getResult('-')<< endl;//-1
    cout << caculator.getResult('*')<< endl;//2
}

通过多态的方式实现:

//计算器的基类
class AbstractCaculator {
public :
    virtual int getResult() {};
    int m_Num1;
    int m_Num2;
};

//加法
class AddCaculator : public AbstractCaculator {
public:
    int getResult() {
        return m_Num1 + m_Num2;
    }
};

//减法
class SubCaculator : public AbstractCaculator {
public:
    int getResult() {
        return m_Num1 - m_Num2;
    }
};

//乘法
class MultiCaculator : public AbstractCaculator {
public:
    int getResult() {
        return m_Num1 * m_Num2;
    }
};

void test1() {
    AbstractCaculator *caculator = new AddCaculator();
    caculator->m_Num1 = 1;
    caculator->m_Num2 = 2;
    cout << caculator->getResult() << endl;//3
    delete caculator;
    caculator = new SubCaculator;
    caculator->m_Num1 = 4;
    caculator->m_Num2 = 2;
    cout << caculator->getResult() << endl;//2
    delete caculator;
    caculator = new MultiCaculator();
    caculator->m_Num1 = 4;
    caculator->m_Num2 = 2;
    cout << caculator->getResult() << endl;//8
    delete caculator;
}

抽象类和纯虚函数:

只要有一个纯虚函数的类就是抽象类。抽象类无法实例化对象,子类必须重写纯虚函数,否则也是抽象类。
纯虚函数语法:virtual 返回值 函数名() = 0;

//只要有一个纯虚函数的类就是抽象类。抽象类不能被实例化。
class Base{//这是一个抽象类,不能被实例化。继承该类的子类需要实现纯虚函数。否则也是抽象函数
public:
    virtual  void func()=0;//这就是纯虚函数的写法。
};

class Son:public Base{
public:
    void func(){
        cout << "子类被func被调用"<<endl;
    }
};

void test(){
    //Base base;//error: variable type 'Base' is an abstract class
   // Base * base = new Base();//error: allocating an object of abstract class type 'Base'
   Son son;
   son.func();//输出:子类被func被调用
}

虚析构函数 和纯析构函数
适用场景:如果子类的属性开辟在堆中,那么父类无法释放子类中的内存。
都是用来解决子类属性申请在堆空间。无法释放内存的问题。

class Animal{
public:
    virtual void speak() = 0;
//    virtual  ~Animal(){
//        cout << "动物基类的析构函数!"<<endl;
//    }
    virtual ~Animal() = 0;

};

class Cat:public Animal{
public:
    Cat(string name){
        cout << "猫的构造函数."<<endl;
        m_Name = new string(name);
    }
    void speak(){
        cout << "猫在讲话."<<endl;
    }

    ~Cat(){
        if (m_Name != NULL){
            delete m_Name;
            m_Name = NULL;
        }
        cout << "猫析构函数执行."<<endl;
    }
    string *m_Name;
};
Animal::~Animal() {
    cout << "动物基类的析构函数!"<<endl;
}

void test(){
    Animal *cat = new Cat("Tom");
    cat->speak();
    delete cat;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容