C++中的多态

今天我想给自己写点东西
最近感觉遇到了瓶颈,博客也有一段时间没有更新了,这段时间很迷茫很困惑,感觉不知道如何去学C++了,也没有了当初的那种热情。学习C++也有一段时间了,当自己想要去实现一个项目的时候才发现自己的不足,没有头绪,完全不知从何下手。然后就这样浑浑噩噩的度过了一段时间。有时候也在想自己是不是不适合编程,后来也想通了,自己下定决心要做的事难道就这么放弃了吗?这不是我!加油吧!!!

1.1.对C++多态的理解:
如果有几个似而不完全相同的对象,有时我们要求在向它们发出同一个消息时,它们的反应各自不同,分别执行不同的操作。这种现象就是多态现象。
举个例子:ABC3个班是高三年级,他们有基本相同的属性和行为,在同时听到上课铃声的时候,他们会分别走向3个不同的教室,而不会走向同一个教室。
多态的意义:
由继承而产生的相关的不同的类,其对象对同一消息做出的不同响应。(能增加程序的灵活性,可减轻系统升级,维护,调试的工作量和复杂度)

1.2.多态实现的前提:
赋值兼容:需要积累对象的任何地方都可以使用公有派生类的对象来替代。赋值兼容是一种默认行为,不需要任何的显示转化步骤。

赋值兼容中所指的替代包括以下几种情况:
1、派生类的对象可以赋值给基类对象。
2、派生类的对象可以初始化基类的引用。
3、派生类对象的地址可以赋给指向基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。

#include <iostream>
using namespace std;
class Shape
{
public:
    Shape(int x,int y)
        :_x(x),_y(y){}
void draw()
{
    cout<<"draw Shap ";
    cout<<"start ("<<_x<<","<<_y<<") "<<endl;
}
//private:
protected:
    int _x;
    int _y;
};
class Circle:public Shape
{
public:
    Circle(int x, int y,int r)
        :Shape(x,y),_r(r){}
void draw()
{
    cout<<"draw Circle ";
    cout<<"start ("<<_x<<","<<_y<<") ";
    cout<<"radio r = "<<_r<<endl;
}
private:
    int _r;
};
int main()
{
    Shape s(3,5);
    s.draw();
    Circle c(1,2,4);
    c.draw();

    s = c;
    s.draw();//派生类对象给基类赋值;

    Shape &rs = c;//派生类的对象初始化基类的引用;
    rs.draw();

    Shape *ps = &c;//派生类对象的地址赋值给指向基类的指针;
    ps->draw();

    return 0;
}

1.3.多态形成的条件
1.3.1.静多态,通过命名傾栈在编译阶段决定(函数重载)
1.3.2.动多态,在运行阶段决定,不是在编译阶段决定。
1.4.虚函数

格式
class 类名
{
        virtual 函数声明;
};

虚函数小结
1.在基类中用virtual声明成员函数为虚函数,类外实现虚函数时,不用再加vritual。
2.在派生类中重新定义此函数称为覆写,要求函数名、返回类型、函数参数个数及类型全部匹配。并根据派生类的需要重新定义函数体。
3.当一个成员函数被声明为虚函数后,其派生类中完全相同的函数(显示的写出)也为虚函数。可以在其前加virtual以似清晰。
4.定义一个指向基类对象的指针,并使其指向其子类的对象,通过该指针调用虚函数,此时调用的就是指针变量指向对象的同名函数。

纯虚函数

**格式**
class 类名
{
    virtual 函数声明 = 0;
};

举个勺子
Shape 类中
virtual void draw() = 0;
Circle 类中

void draw()
{
    cout << "draw Circle";
    cout << "start (" << _x << "," << _y << ")";
    cout << "radio r = " << _r << endl;
}

测试

int main()
{
    Shape s(1,2);//纯虚函数又称抽象基类;
    Circle c(1,2,3);
    Rect r(1,2,3,5);

    Shape *pc = &c;
    pc->draw();

    pc = &r;
    pc->draw();
    return 0;
}

纯虚函数小结
1.含有纯虚函数的类称为抽象基类,不可实例化(即不能创建对象)。存在的意义就是被继承,提供公共接口
2.纯虚函数只有声明,没有实现。

含有虚函数的析构
含有虚函数的类,析构函数也应该声明为虚函数。在delete分类指针的时候,会调用类的析构函数,实现完整析构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值