派生类的拷贝构造函数--发布日期:2006-12-25

原创 2008年10月02日 18:20:00

刚刚弄了一个关于派生类的实验,里面涉及到了派生类的拷贝构造函数,这时才发现自己在这个知识点上还很模糊。在CSDN上面看了下相关的一篇文章后,稍微有了点感觉。现总以一个例子总结如下:

情况(1). 派生类的copy   constructor未定义

#include   <iostream>  
using   namespace   std   ;  
   
class   base  
{  
public:  
base()   {   cout   <<   "base::base()"   <<   endl   ;   }  
base(   const   base&   )   {   cout   <<   "base::base(   const   base&)"   <<   endl   ;   }  
virtual   ~base()   {   cout   <<   "base::~base()"   <<   endl   ;   }  
};  
   
class   child   :   public   base  
{  
   
public:  
child()   {   cout   <<   "child::child()"     <<   endl   ;   }  
/*------------------------------------------------------------------  
child(   const   child&   )   {   cout   <<   "child::child(   const   child&   )" <<   endl   ;   }     
-------------------------------------------------------------------*/  
~child()   {   cout   <<   "child::~child()"   <<   endl   ;   }  
int   test(int   i)   {   cout   <<   "int   child::test(int)"   <<   endl   ;  

return   0   ;   }  
   
};  
   
int main()  
{  
child   c1   ;  
cout   <<   "----------------------------"   <<   endl   ;  
child   c2(c1)   ;  
cout   <<   "----------------------------"   <<   endl   ;  
}  
输出结果:  
base::base()  
child::child()  
----------------------------  
base::base(   const   base&)
----------------------------  
child::~child()  
base::~base()  
child::~child()  
base::~base()  

注意 child   c2(c1)   ;   调用了基类的拷贝构造函数,这是为什么呢?因为派生类没有显式定义自己的拷贝构造函数,而基类定义了。首先child公有继承base,且base::copy   ctor也是public的,那么对child类而言,基类copy   ctor是可见的。 child   c2(c1)   ;   这句,编译器先找child自己的copy   ctor,没有。这时就去找基类的copy   ctor。由于它的参数是这样定义的:const   base&   ,即用到了基类对象的引用,所以这里有多态的能力,比如child   c2(c1)   ;

看下面这个例子

#include   <iostream>  
using   namespace   std   ;  
   
class   base  
{  
public:  
base(){cout<<"base::base()"<< endl;}  
base(const base& rhs)  
{  
cout<<"base::base(const base&)"<<endl;    
rhs.show();    
}  
virtual   void show() const {cout<<"base::show()"<<endl;}  
virtual   ~base()   {cout<<"base::~base()"<<endl;}  
};  
   
class   child:public base  
{  
public:  
child()   {cout<<"child::child()"<<endl;}  
/*------------------------------------------------------------------  
child(   const   child&   )   {   cout   <<   "child::child(   const   child&   )" <<   endl   ;   }     
-------------------------------------------------------------------*/  
~child(){cout<<"child::~child()"<<endl;}  
virtual void show()const {cout<<"child::show()"<<endl;}  
int test(int i) {cout<<"int child::test(int)"<<endl;return 0;}  
};  
   
int   main()  
{  
   child   c1   ;  
   cout<<"----------------------------"<<endl;  
   child   c2(c1);  
   cout<<"----------------------------"<<endl;  
}  

输出为:

base::base()  
child::child()  
----------------------------  
base::base(   const   base&)  

child::show()
----------------------------  
child::~child()  
base::~base()  
child::~child()  
base::~base()  

2基类也没有显式定义自己的拷贝构造函数

#include <iostream>
using namespace std ;

class base
{
public:
base() { cout << "base::base()" << endl ; }
/*base( const base& ) { cout << "base::base( const base&)" << endl ; } */
virtual ~base() { cout << "base::~base()" << endl ; }
};

class child : public base
{

public:
child() { cout << "child::child()" << endl ; }
/*------------------------------------------------------------------
child( const child& ) { cout << "child::child( const child& )" << endl ; }   
-------------------------------------------------------------------*/
~child() { cout << "child::~child()" << endl ; }
int test(int i) { cout << "int child::test(int)" << endl ; return 0 ; }

};   
    
   int main()
{
child c1 ;
cout << "----------------------------" << endl ;
child c2(c1) ;
cout << "----------------------------" << endl ;
}  

输出结果:
base::base()
child::child()
----------------------------   
----------------------------
child::~child()
base::~base()
child::~child()
base::~base()  

这时child c2(c1) ; 调用的是自己的默认拷贝构造函数,同时也会调用基类的默认构造函数(为什么是构造函数不是拷贝构造函数,下面的一种情况就会看到),既然默认的构造函数什么所以不会有什么输出信息。


3基类和派生类都显式定义了自己都拷贝构造函数

#include <iostream>
using namespace std ;

class base
{
public:
base() { cout << "base::base()" << endl ; }   
base( const base& ) { cout << "base::base( const base&)" << endl ; }   
virtual ~base() { cout << "base::~base()" << endl ; }
};

class child : public base
{

public:
child() { cout << "child::child()" << endl ; }   
child( const child& ) { cout << "child::child( const child& )" << endl ; }   
~child() { cout << "child::~child()" << endl ; }
int test(int i) { cout << "int child::test(int)" << endl ; return 0 ; }

};   
    
   int main()
{
child c1 ;
cout << "----------------------------" << endl ;
child c2(c1) ;
cout << "----------------------------" << endl ;
}  

输出为:

base::base()
child::child()
----------------------------
base::base()
child::child( const child& )
----------------------------
child::~child()
base::~base()
child::~child()
base::~base()  

注意这里child c2(c1) ;   调用了基类的构造函数而不是拷贝构造函数,这又是为什么呢?
请问拷贝构造函数是不是构造函数??    是,是个特殊的构造函数,但是他也是构造函数。C2调用自己的拷贝构造函数的时候,编译器只是认为你调用了构造函数,根据参数类型是调用我们所说的拷贝构造函数,但是当他决定调用基类的哪个构造函数的时候,他要看你传递给基类的参数了,你什么都没有给传递,当然调用默认构造函数了。

我想通过上面三种情况的讲解大家应该都能明白派生类拷贝构造函数的奥妙了,通过这个例子也对我学习C++的过程敲了下警钟:知识面还是不广,综合运用所学东西的能力还不够,尤其是那个多态的地方,如果是单独的多态可能一下子就看出来了,但是用在这里就傻眼了。

C++:派生类的默认构造函数和拷贝构造函数调用基类构造函数的机制(含程序验证)

C++:派生类的默认构造函数和拷贝构造函数调用基类构造函数的机制(含程序验证) 1、如果基类定义了不带参数的默认构造函数,则编译器为派生类自动生成的默认构造函数会调用基类的默认构造函数。 ...
  • u013149325
  • u013149325
  • 2015年01月21日 10:53
  • 1852

C++之派生类的拷贝构造与赋值运算符重载

这里只说一下为什么派生类在拷贝构造器和赋值运算符重载中一些注意语法: 一、派生类的拷贝构造器1.派生类的拷贝构造器跟普通构造器一样,若没有自定义生成,编译器会自动生成拷贝构造器,自动调用父类的拷贝构...
  • maoliran
  • maoliran
  • 2016年06月09日 19:28
  • 1672

派生类的构造函数的初始化列表问题

一、派生类不能在成员初始化列表中直接初始化基类的成员 初始化基类成员 构造函数是不可继承的。因此,派生类的构造函数必须通过调用基类的构造函数初始化基类成员,不能够在派生类初始化列表直接初始化基类的...
  • libaineu2004
  • libaineu2004
  • 2014年02月20日 17:47
  • 7162

组合类、派生类 拷贝构造函数

在派生类中如何写拷贝构造函数 一种形式:派生类拷贝构造函数名(对象p的引用):基类构造函数名(参数列表) 如:student::student(student&p):stud(p.num,...
  • ps4nanari
  • ps4nanari
  • 2012年12月10日 18:01
  • 274

C++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数

构造函数 ,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数...
  • u012339743
  • u012339743
  • 2014年08月16日 21:05
  • 1319

smartptr应用及拷贝构造函数使用 源码

  • 2010年11月10日 16:05
  • 6KB
  • 下载

C++中拷贝构造函数的使用

  • 2012年07月29日 08:56
  • 275KB
  • 下载

拷贝构造函数

  • 2014年03月10日 22:22
  • 35KB
  • 下载

C++拷贝构造函数和赋值操作

  • 2012年01月10日 13:51
  • 3KB
  • 下载

拷贝构造函数..........

  • 2008年09月11日 23:26
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:派生类的拷贝构造函数--发布日期:2006-12-25
举报原因:
原因补充:

(最多只允许输入30个字)