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++程序中使用虚函数,虚继承和虚析构是很好的习惯 可以避免许多的问题。

  • 相关阅读:
    DEV—【GridControl添加按钮列】
    DEV—【GridControl主从表】
    DEV—【GridControl 按钮列无法触发点击事件解决方案】
    WCF入门大致思路
    .Net应用导入、导出Excel文件
    .Net应用自定义鼠标样式
    VS打包后生成快捷方式:目标指向错误、Icon图标分辨率有误问题解决方案
    在Paint事件中绘制控件(边框)
    Android SDK Manager下载失败后 更新列表的正确设置
    关于sql分页
  • 原文地址:https://www.cnblogs.com/ligei/p/11443857.html
Copyright © 2011-2022 走看看