类成员函数继承(virtual、非virtual)

来源:互联网 发布:linux 挂起进程 编辑:程序博客网 时间:2024/04/29 07:54

转帖地址:http://www.cppblog.com/liyuxia713/archive/2010/01/08/105170.html

 类继承
对于父类函数(virtual、非virtual),如果子类没有同名函数,则正常继承
对于父类函数(virtual、非virtual),如果子类有同名函数,无同型函数,则不能调用父类函数
对于父类函数(virtual、非virtual),如果有同型函数:
----
virtual函数由指针类型决定调用哪个
----virtual
函数由指针指向的对象决定调用哪个(运行时决定)

 //
如果对于父类函数(virtual/virtual),如果子类没有同名函数,则正常继承

classBase
{
       public:  void func(int i){cout <<"Base::func(int)"<< endl; }    
};

class Derived : public Base
{ }; 

int main()
{
         Base *pb = new Derived();
         pb->func(1); //Base::func(int)
         delete pb;
         Derived *pd = new Derived();
         pd->func(1); //Base::func(int)
         delete pd;         
}

//
对于父类函数(virtual、非virutal),子类有同名函数,无同型函数,则不能调用父类函数
class Base
{
public:
     void func(int i){ cout <<"Base::func(inti)"<< endl; } 
     virtual void func2(int i) { cout <<"Base::func2(int i)" << endl;}
}; 

class Derived : public Base

{
public:      
      void func(){ cout<<"Derived::func()"<< endl; } 
      void func2(){ cout<<"Derived::func2()"<< endl; } 
}; 


int main()
{
         Base *pb = new Derived();
         pb->func(1); //Base::func(int)
         pb->func2(1); //Base::func2(int i)
         delete pb; 

         Derived *pd = new Derived();
         pd->func(); //Derived::func()
         pd->func2(); //Derived::func2()
         // pd->func2(1); //
不能调用 
         delete pd;       
}

//
对于父类函数(virtual、非virtual),如果有同型函数:
//----
virtual函数由指针类型决定调用哪个
//----virtual
函数由指针指向的对象决定调用哪个(运行时决定)

class Base
{
 public:
     void func(int i){ cout <<"Base::func(inti)"<< endl; }
     void func() {cout << "Base::func() "<< endl;}
     virtual void func2(int i) { cout <<"Base::func2(int i)" << endl;}
};

class Derived : public Base
{
 public:      
      void func(int i){ cout<<"Derived::func()"<< endl; } 
      void func2(int i){ cout<<"Derived::func2(int i)"<< endl; } 
};

int main()
{
         Base *pb = new Derived();
         pb->func(1);  //Base::func(int i)
         pb->func();  //Base:func()
         pb->func2(1);  //Derived::func2(inti)
         delete pb; 

         Derived *pd = new Derived();
         pd->func(1); //Derived::func(int i)
         // pd->func(); //
不能调用 
         pd->func2(1); //Derived::func2(int i)
         delete pd;
}

 

原创粉丝点击