C语言 c++ php mysql nginx linux lnmp lamp lanmp memcache redis 面试 笔记 ppt 设计模式 问题 远程连接

c++学习-虚函数

 

#include <iostream>
using namespace std;

class common{
public:
    virtual void hello(){cout<<"common hello"<<endl;}

};

class a: public common{
public:
    //重写基类的虚函数后,本函数也是虚函数 可以省略 virtual
    virtual void hello(){cout<<"a hello"<<endl;}
};


class b: public common{
public:
    void hello(){cout<<"b hello"<<endl;}
};



int main()
{
    //动态联编 在运行时才确定哪个指针确定哪个对象
    //静态联编 在编译时就确定哪个指针确定哪个对象 速度快,浪费小

    //虚函数实现了调用指向真实对象的方法
    common *p = new a();
    p->hello();


    return 0;
}

 

静态联编:在编译时就确定指针指向的类

#include <iostream>
using namespace std;

class common{
public:
     void hello(){cout<<"common hello"<<endl;}

};

class a: public common{
public:
     void hello(){cout<<"a hello"<<endl;}
};


class b: public common{
public:
    void hello(){cout<<"b hello"<<endl;}
};



int main()
{
    a i;
    common *p; //在编译时就确定指向 common 类,再改变也是无效的
    p = &i;
    p->hello();


    return 0;
}

 

多态满足的条件:

#include <iostream>
using namespace std;

class father{
public:
    virtual void hello(){cout<<"father hello"<<endl;}

};

class son: public father{
public:
     void hello(){cout<<"son hello"<<endl;}
};


class doc: public father{
public:
    void hello(){cout<<"doc hello"<<endl;}
};

void one(father one)
{
    one.hello();
}
void two(father *two)
{
    two->hello();
}
void three(father &three)
{
    three.hello();
}


int main()
{
    /**
    满足多态的条件:
    1、继承
    2、父类引用指向子类对象(指针或引用)
    3、基类函数为虚函数
    */

    father *p=0;
    int choice;

    while(1){
        bool quit = false;
        
        cout<<"0:退出,1:儿子, 2:女儿, 3:父亲"<<endl;
        cin>>choice;
        
        switch(choice)
        {
            case 0:
                quit=true;
                 break;
            case 1:
                p = new son();
                one(*p);
                break;
            case 2:
                p = new doc();
                two(p);
                break;
            case 3:
                p=new father();
                three(*p);
        }


        if(quit)
        {
            break;
        }
    
    }


    return 0;
}

 

强制使用静态连接:

#include <iostream>
using namespace std;

class father{
public:
    virtual void hello(){cout<<"father hello"<<endl;}

};

class son: public father{
public:
     void hello(){cout<<"son hello"<<endl;}
};


class doc: public father{
public:
    void hello(){cout<<"doc hello"<<endl;}
};

void one(father one)
{
    one.hello();
}
void two(father *two)
{
    two->hello();
}
void three(father &three)
{
    three.hello();
}


int main()
{

    father *p=0;
    son a=son();
    p=&a;
    p->father::hello();//强制使用静态连接

    return 0;
}

 

基类析构函数应声明为 virutal

#include <iostream>
using namespace std;

class father{
public:
    virtual void hello(){cout<<"father hello"<<endl;}
    father(){cout<<"father construct"<<endl;}
    //@warn
    virtual ~father(){cout<<"father destruct"<<endl;} //父类虚析构函数会自动调用子类虚析构函数
};

class son: public father{
public:
     void hello(){cout<<"son hello"<<endl;}
         son(){cout<<"son construct"<<endl;}
    ~son(){cout<<"son destruct"<<endl;}
};


int main()
{
    father *p = new son();
    delete p;

    return 0;
}

 

posted on 2015-06-21 15:21  思齐_  阅读(223)  评论(0编辑  收藏  举报