基类和派生类

来源:互联网 发布:淘宝拉夏贝尔代购 编辑:程序博客网 时间:2024/06/11 23:18

对象类型:静态类型和动态类型。静态类型是在编译时就已经知道的类型。动态类型是在内存中的对象,直到运行时才知道类型。
如果基类base中有虚函数,派生类sub继承基类,在初始化时:
1、通过类定义的基类对象,用派生类去初始化基类时,基类对象不会转化为派生类对象,即基类对象调用的函数还是自己内部写的;
2、通过指针,定义的基类对象,用派生类去初始化时,会将此基类对象转化为派生类对象,即调用的重载函数是派生类内部的函数,和基类的函数无关。即:基类的指针或引用可以绑定的派生类对象上,这也就对于工厂模式最好的利用。可以通过基类的调用,在程序运行中,根据不同的配置,去实例化不同的版本的对象。例如db2类和oracle类。
3、基类中有虚函数,对基类实例化对象以后,该对象仍能够调用该虚函数,且能执行。当使用基类的指针或引用时,调用一个虚函数会执行动态绑定,即直到运行时才知道调用了哪个版本的虚函数,所以所有的虚函数都必须有定义,不管是否用到,因为连编译器也无法确定到底会使用哪个虚函数;
4、记住:动态绑定只有当通过指针或引用调用虚函数时才会发生。当通过一个具有普通类型而非指针或引用,调用虚函数时,在编译时就会将调用的版本确定下来。
5、基类中的虚函数,则在其以后的所有派生类中都是虚函数。所以不必在派生类中还对重载的虚函数使用virtual。
代码如下:

#include<iostream>using namespace std;class base{public:    //base(int temp):s(temp){}    void dog()    {        cout<<"dog"<<endl;    }    virtual void animal()    {        cout<<"animal"<<endl;    }    //int s;};class sub:public base{public:    //sub(int temp):base(temp){}    void animal() override    {        cout<<"my animal"<<endl;    }    void our()    {        cout<<"our"<<endl;    }};void main(){    /*sub sub1;    base parent(sub1);    parent.animal();//输出animal    system("pause");*/    base  *parent = new sub();    parent->animal();//输出:my animal    system("pause");}
0 0
原创粉丝点击