zoukankan      html  css  js  c++  java
  • c++虚函数和虚继承

    关键字virtual用于父类方法,如果传了一个子类对象,并且子类重写了父类的这个virtual方法,就会调用子类的方法。传谁就调用谁,这个就是多态。
    #include<iostream> using namespace std; class Biological{ public: virtual void range(){ cout<<"widely"<<endl; } void name(){ cout<<"biological"<<endl; } }; class Animal:public Biological{ public: virtual void range(){ cout<<"medium"<<endl; } void name(){ cout<<"animal"<<endl; } }; class Person:public Animal{ public: virtual void range(){ cout<<"small"<<endl; } void name(){ cout<<"person"<<endl; } }; void Display(Biological *p){ p->range(); p->name(); delete p; } int main(){ Display(new Biological); Display(new Animal); Display(new Person); return 0; }

    #include<iostream> 
    using namespace std;
    
    class Biological{
    public:
        Biological(){
            cout<<"Biological构造"<<endl; 
        }
    
        ~Biological(){
            cout<<"Biological析构"<<endl; 
        }
    };
    
    class Animal:virtual public Biological{
    public:
        Animal(){
            cout<<"Animal构造"<<endl; 
        }
    
        ~Animal(){
            cout<<"Animal析构"<<endl; 
        }
    };
    
    class Plant:virtual public Biological{
    public:
        Plant(){
            cout<<"Plant构造"<<endl; 
        }
    
        ~Plant(){
            cout<<"Plant析构"<<endl; 
        }
    };
    
    class SeaAnemone:public Animal,public Plant{
    public:
        SeaAnemone(){
            cout<<"SeaAnemone构造"<<endl; 
        }
    
        ~SeaAnemone(){
            cout<<"SeaAnemone析构"<<endl; 
        }
    };
    
    
    int main(){
        SeaAnemone sea_anemone;
        return 0;
    }

    #include<iostream> 
    using namespace std;
    
    class Biological{
    public:
        Biological(){
            cout<<"Biological构造"<<endl; 
        }
    
        virtual ~Biological(){
            cout<<"Biological析构"<<endl; 
        }
    private:
        char *name;
    };
    
    class Animal:virtual public Biological{
    public:
        Animal(){
            cout<<"Animal构造"<<endl; 
        }
    
        ~Animal(){
            cout<<"Animal析构"<<endl; 
        }
    };
    
    class Plant:virtual public Biological{
    public:
        Plant(){
            cout<<"Plant构造"<<endl; 
        }
    
        ~Plant(){
            cout<<"Plant析构"<<endl; 
        }
    };
    
    class SeaAnemone:public Animal,public Plant{
    public:
        SeaAnemone(){
            cout<<"SeaAnemone构造"<<endl; 
        }
    
        ~SeaAnemone(){
            cout<<"SeaAnemone析构"<<endl; 
        }
    };
    
    
    int main(){
        Biological *sea_anemone = new SeaAnemone;
        delete sea_anemone;
        return 0;
    }

    注意:如果将~Biological()函数前的virtual去掉那么函数会出错。

    总结:我们一定要注意在基类的析构函数前面加上virtual,使其变成虚析构在C++程序中使用虚函数,虚继承和虚析构是很好的习惯 可以避免许多的问题。

  • 相关阅读:
    Tomcat在Linux下的安装与配置
    Intel S5000VSA(SAS)主板设置RAID 步骤【转】
    eclipse 安装Subversion1.82(SVN)插件
    shell脚本分析nginx日志
    shell脚本抓取网页信息
    shell脚本备份日志
    电力项目十一--js添加浮动框
    电力项目五--主界面分析
    This function has none of DETERMINISTIC, NO SQL
    mysql导入数据失败:mysql max_allowed_packet 设置过小
  • 原文地址:https://www.cnblogs.com/ligei/p/11443857.html
Copyright © 2011-2022 走看看