代码之家  ›  专栏  ›  技术社区  ›  Nav MetroidFan2002

虚拟函数不允许多函数重载吗?

c++
  •  1
  • Nav MetroidFan2002  · 技术社区  · 16 年前

    我的程序编译得很好,但调用重载函数时会转储内核。下面是程序的输出:

    FoodID supplied=1
    FoodBase constructor called
    In K constructor
    In Omlette constructor
    Omlette handler constructor called
    In prepare() Omlette Handler
    Mix called
    K Prepare called
    K Egg called
    DonePreparing called
    In egg() Omlette Handler
    Segmentation fault (core dumped)
    

    我试图重载名为“egg”的纯虚拟函数。egg函数需要有两种类型:一种不接受变量,另一种接受整数。取整数的那个崩溃了。救命啊?

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    
    class K
    {
        public:
        K() {cout<<"In K constructor"<<endl;}
    
        protected:
        void kPrepare() {cout<<"K Prepare called"<<endl;}
        void kEgg() {cout<<"K Egg called"<<endl;}
    };
    
    class Omlette : public K
    {
        public:
        Omlette() {cout<<"In Omlette constructor"<<endl;}
    
        protected:
        void doPreparation()
        {
            mix();
            kPrepare();
            kEgg();
            donePreparing();
        }
        void mix() {cout<<"Mix called"<<endl;}
        void donePreparing() {cout<<"DonePreparing called"<<endl;}  
    };
    
    class FoodBase
    {
        public:
        virtual void prepare()=0;
        virtual void egg()=0;
        virtual void egg(int)=0;
    
        FoodBase() {cout<<"FoodBase constructor called"<<endl;}
    
    };
    
    class OmletteHandler : public FoodBase, Omlette
    {   
        public:
        OmletteHandler() {cout<<"Omlette handler constructor called"<<endl;}
        void prepare() 
        {
            cout<<"In prepare() Omlette Handler"<<endl;
            doPreparation();//from Omlette class
        }
        void egg() {cout<<"In egg() Omlette Handler"<<endl;}
        void egg(int i) {cout<<"In egg("<<i<<") Omlette Handler"<<endl;}
    };
    
    class Food
    {
        public:
        FoodBase *base;
    
        Food(int foodID)//getting foodID from commandline just for testing purpose
        {
            OmletteHandler immediate;//changed from 'imm' to 'immediate'
            base=&immediate;
        }//Food
    
        void prepare() {base->prepare();}
        void egg() {base->egg();}
        void egg(int i) {base->egg(i);}
    };
    
    int main(int argc, char *argv[])
    {
        int foodID=1;
        if (argc>1) {foodID = atoi(argv[1]);}
    
        cout<<"FoodID supplied="<<foodID<<endl; 
    
        Food f(foodID);
        f.prepare();
        f.egg();
        f.egg(10);
    
    }//main
    
    1 回复  |  直到 16 年前
        1
  •  7
  •   user180326 user180326    16 年前

    在Food构造函数中,您在堆栈上创建了一个OmeletteHandler,一旦函数退出,它就会被销毁。

    Food(int foodID)//getting foodID from commandline just for testing purpose 
    { 
        OmletteHandler imm; 
        base=&imm; 
    }//
    

    你能做到的 base = new OmeletteHandler() 相反,(以后不要忘记删除指针,否则会导致内存泄漏)。