多态(静态、动态、函数、宏)

静态多态
静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数。对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系,必须存在必需的同名成员函数。
优点:

1、由于静多态是在编译期完成的,因此效率较高,编译器也可以进行优化;
2、静态多态通过模板编程为C++带来了泛型设计的概念,比如强大的STL库。

缺点:

由于是模板来实现静态多态,因此模板的不足也就是静多态的劣势,比如调试困难、编译耗时、代码膨胀、编译器支持的兼容性。

//静态多态
class Fly
{
public:
     void  fly() = 0;
};

class Duck :public Fly
{
public:
        void fly()
    {
        cout << "duck can't fly" << endl;
    }
};

class Chicken :public Fly
{
public:
     void fly()
    {
        cout << "chicken can't fly" << endl;
    }
};
void _fly(Fly& f)
{
    f.fly();
}
void test2()
{
    Duck d;
    Chicken c;
    _fly(d);
    _fly(c);
}

动态多态
动态多态则是利用虚函数和继承机制实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会调哪个函数。

虚函数 就是在基类中声明该函数是虚拟的(在函数之前加virtual关键字),然后在子类中正式的定义(子类中的该函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同,此时才能称为重写,才符合虚函数,否则就是函数的重载),再定义一个指向基类对象的指针,然后使该指针指向由该基类派生的子类对象,再然后用这个指针来调用改虚函数,就能实现动态多态。

缺点:
编译器不可对虚函数进行优化。

//动态多态
class Fly
{
public:
    virtual void  fly() = 0;
};

class Duck :public Fly
{
public:
    virtual void fly()
    {
        cout << "duck can't fly" << endl;
    }
};

class Chicken :public Fly
{
public:
    virtual void fly()
    {
        cout << "chicken can't fly" << endl;
    }
};
void _fly(Fly* f)
{
    f->fly();
}
void test1()
{
    Duck d;
    Chicken c;
    _fly(&d);
    _fly(&c);
}

静态多态与动态多态的比较

不同点:

1、本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现;
2、动态多态中接口是显式的,通过虚函数在运行期实现,静态多态中接口是隐式的,通过模板具现在编译期完成。

相同点:

1、都能够实现多态性,静态多态/编译期多态、动态多态/运行期多态;
2、都能够使接口和实现相分离,一个是模板定义接口,类型参数定义实现,一个是基类虚函数定义接口,继承类负责实现;

函数多态
即重载,基于不同的函数参数列表,相同名称的函数可以指向不同的函数定义。

//函数多态
int _add(int a, int b)
{
    return a + b;
}
int _add(int a, string b)
{
    return a + atoi(b.c_str());
}
void test4()
{

    int ret1 = _add(3, 7);
    int ret2 = _add(2, "a");
    cout << "ret1=" << ret1 << endl;
    cout << "ret2=" << ret2 << endl;
}

宏多态
带变量的宏实现的初级形式的静态多态。

//宏多态
void test3()
{
    int n1 = 10;
    int n2 = 20;
    string str1 = "hello";
    string str2 = "world";
    int ret1 = ADD(n1, n2);
    string ret2 = ADD(str1,str2);
    cout << "n1+n2=" << ret1 << endl;

    cout << "str1+str2=" << ret2 << endl;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值