zoukankan      html  css  js  c++  java
  • 动态多态与静态多态(转)

    多态的字面含义:具有多种不同的形态。

    关键字:重载/模版和虚函数

    类型:编译期多态(静态多态,早绑定)和运行期多态(晚绑定)

    编译期多态(重载/模版):

    重载

    int getMax(int param1,int param2);

    double getMax(double param1,double param2);

    模版:

    template<typename T>

    T getMax(T param1,T param2)

    {

    return param1>param2?param1:param2;

    }

    运行期多态(虚函数):

    class Base

    {

    public:

    virtual ~Base(){}

    virtual void fun(){cout<<"Base::fun"<<endl;}

    };

    class Derived:public Base

    {

    public:

    virtual void fun(){cout<<"Derived::fun"<<endl;}

    };

    main()

    {

    Base *pB=new Derived;

    pB->fun();

    }

    总结:

    应用形式上:

    静多态是发散式的,让相同的实现代码应用于不同的场合。

    动多态是收敛式的,让不同的实现代码应用于相同的场合。

    思维方式上:

    静多态是泛型式编程风格,它看重的是算法的普适性。

    动多态是对象式编程风格,它看重的是接口和实现的分离度。

    C/C++参数传递的3种方式
    在C/C++程序设计中有3种参数传递方式
    1. (单向)值传递
    单向值传递一般用于C/C++程序中简单数据类型的数据作为参数传入。
    #include <stdio.h>
    int swap(int age1,int age2)
    {
        int tmp = age1;
        age1 = age2;
        age2 = tmp;
        printf("%d %d ",age1,age2);
        return 0;
    }
    int main()
    {
        int age_1 = 20;
        int age_2 = 21;
        func1(age_1,age_2);
        printf("%d %d ",age_1,age_2);
        return 0;
    }
    如上代码 age1,age2参数就是用于func1函数的输入的,虽在func1函数内部交换了age1和age2的值,但是在main函数中的age1 age2值仍然是20 21。这个就是单向传递,方向从调用函数中将值传递到被调函数中,在被调用函数中的任何对形参的改变都不会影响实参的值。
    在C++程序中也可以使用这种方式,但是当单向传递的参数是结构体或者类类型的变量的时候咱们就不会考虑使用这种方法了。原因在方式2中说明。
    2. 地址传递
    将地址作为参数传递在C/C++中均可使用。
    由第一种方式我们知道简单数据类型作为单向值传递很清晰简洁,对于复合的数据类型如果还是采用方式1的话就会带来不必要的开销。
    此时我们考虑在C中使用方式2,在C++中优先考虑使用方式3.
    #include <stdio.h>
    int swap(int *age1,int *age2)
    {
        int tmp = *age1;
        *age1 = *age2;
        *age2 = tmp;
        printf("%d %d ",*age1,*age2);
        return 0;
    }
    int main()
    {
        int age1 = 20;
        int age2 = 21;
        func1(&age1,&age2);
        printf("%d %d ",age1,age2);
        return 0;
    }
    在以上代码中在主调函数中传递变量的地址,在被调函数中参数使用指针变量接受实参地址,通过对形参的解引用操作取出实参的值 借助临时变量实现两个指针指向的变量的值的交换。
    方式2的中如果通过形参指针变量对其指向的地址写入了数据。那么函数在结束调用的时候写入数据的影响并不会消失。所以main函数中打印出21 20。
    3. (双向)引用传递
    由于引用是C++程序设计的概念,因此引用传递只能在C++程序中使用。
    引用操作简单,在使用的时候当作简单的一个变量使用即可。如果在不深究期实现原理的情况下,可以简单的认为引用就是变量的一个别名即可。
    #include <stdio.h>
    int swap(int &age1,int &age2)
    {
        int tmp = age1;
        age1 = age2;
        age2 = tmp;
        printf("%d %d ",age1,age2);
        return 0;
    }
    int main()
    {
        int age1 = 20;
        int age2 = 21;
        func1(age1,age2);
        printf("%d %d ",age1,age2);
        return 0;
    }
    在C++程序设计中大量使用了对象的(常)引用,因此希望朋友们能够理解引用的用法。

    增加:insert into 数据表(字段1,字段2,字段3) values('值1','值2','值3')
    删除:delete from 数据表 where id=你要删除的数据id
    修改:update 数据表 set 字段1=‘值1’,字段2=‘值2’,字段3=‘值3’ where id=你要修改的数据ID
    查询:select(你要查询的字段,*代表全部字段) from 表名 where (你的查询条件)
    注意,当你表中字段对应数据类型能进行加减乘除运算(int,float,money等等)时,T_sql中赋值不需要单引号,另外id一般是数据表主键,一般会作为删、改的where子句条件,当然你也可以根据其他条件来写where子句。当删改中不加where子句时,会删除整张表数据或修改整张表对应数据

  • 相关阅读:
    复制文件-用FileOutputStream和FileInputStream读写文件
    向属性文件中添加属性
    合并多个文件的内容
    EVA4400存储RAID信息丢失数据恢复过程
    DELL Eq PS4000数据恢复成功案例
    华为OceanStor S5600T服务器数据恢复
    IBM ds4700崩溃重组raid及修复数据库
    分析IBM AIX存储层结构 / 常用存储命令整理
    riad5阵列崩溃,恢复数据过程
    如何使用Handy Backup 6.2进行数据备份(步骤阅读)
  • 原文地址:https://www.cnblogs.com/jx-yangbo/p/4896484.html
Copyright © 2011-2022 走看看