C++继承学习笔记

来源:互联网 发布:ftp连接阿里云 编辑:程序博客网 时间:2024/05/18 08:52

     派生类从基类继承了保护(protected)成员和公有(public)成员函数,但是继承不了基类的重载构造函数。

定义一个如下基类:

 

class Counter
{
//private:
       // int count;
protected:
        int num,count;
public:
        Counter();
        Counter(int var);
        ~Counter();
        void operator ++ (){ count++; num++;}
        Counter operator + (Counter N);
        void Reset(){ count=0;num=0; }
        int GetCount(){return count;}
        int Getnum() {return num;}
};

 

 

Counter Counter::operator + (Counter N)
{
       Counter X;
       X.count=count+N.count;
       return X;
}
  
Counter::Counter()
{     
      count=0;num=0;
      cout<<"/n A new 0 Counter class is be created;";        
}

Counter::Counter(int var)
{
      count=var; 
      num=var;              
      cout<<"/n A new SET Counter class is be created;";               
}           

Counter::~Counter() 
{
      cout<<"/n This Counter 我 Class's job is done!There has no job to do !";                   
}   

        

从基类派生一个类:

class NewCounter:public Counter
{
public:
       
       void operator --();
}; 

 

void NewCounter::operator --()
{
     num--;
    // count--;
}

 

主程序定义如下几个对象:

int main(int main(int argc, char *argv[])

{

   Counter MyCount,YourCount(1),HisCount;
   
    NewCounter MyNewCounter(5);

 

}

    当我尝试用5来初始化MyNewCounter时,编译器报错。此时回忆起构造函数的定义:构造函数必须与类同名,系统允许重载构造函数。

在上个派生类对象MyNewCounter声明中我未定义构造函数NewCounter(int var);所以无法初始化这个对象。 

   首先修改程序如下:

int main(int main(int argc, char *argv[])

{

   Counter MyCount,YourCount(1),HisCount;
   
    NewCounter MyNewCounter;

 

}

    编译通过!

    通过设置断点,发现生成对象MyNewCounter前会先调用基类的默认构造函数Counter::Counter(),通过构造函数将num,count初始化为0值;

    为了达到将派生类对象初始化成自己想要的结果,我尝试修改派生类声明定义如下:

class NewCounter:public Counter
{
public:
       NewCounter();
       void operator --();
};           

NewCounter::NewCounter()
{
       num=1;count=1; 
       cout<<"/n A new 1 NewCounter class is be created;";                    
}

    主程序不变!

    通过编译运行,发现对象MyNewCounter在生成时先调用一次基类的构造函数Counter,接着才调用派生类的构造函数NewCounter();

且如愿将num,和count初始化为1。

 

    接着,再为派生类NewCounter增加一个重载构造函数如下:

NewCounter::NewCounter(int var)

{

             num=var;

             count=var;

}

  

    修改主程序如下:

  

int main(int main(int argc, char *argv[])

{

   Counter MyCount,YourCount(1),HisCount;
   
    NewCounter MyNewCounter(5);

 

}

    编译调试结果:

    程序成功生成一个初始化为5的对象,仍然是先调用基类的构造函数,再调用派生类的重载构造函数。

 

    学习心得体会:在派生类生成对象时想要使用重载的构造函数初始化对象的话,必须要在派生类中重新定义重载的构造函数。