2010-01-17 86 views
4

假设我有一个基类Person,并且我公开继承了基类Person中的类Teacher。 现在在主函数中我写的是这样的面向对象编程,继承,复制构造函数

// name will be passed to the base class constructor and 17 
// is for derived class constructor. 
Teacher object(“name”,17) ; 
Teacher object1=object; //call to copy constructor 

现在我没有写拷贝构造函数为两个类,关闭过程中,默认的拷贝构造函数将被调用。 Person类的默认拷贝构造函数将首先调用基类的拷贝构造函数。现在

问题是假设我写的基类唯一的,是发生了什么,派生类的默认拷贝构造函数会叫我写的拷贝构造函数拷贝构造函数。
现在假设我为这两个类编写了复制构造函数。现在派生类(即Teacher)的复制构造函数将调用基类的默认构造函数,但不会调用复制构造函数为什么?
是派生类中唯一的缺省拷贝构造函数可以自动调用基类的拷贝构造函数?

+0

没有“Default Copy Constructor”这样的东西。但是编译器生成的拷贝构造函数会调用基类的拷贝构造函数。 – 2010-01-17 20:44:51

+0

现在,谢谢你,我明白了这一点。 – 2010-01-17 20:49:36

回答

8

你必须明确地调用基复制构造函数:

Teacher(const Teacher& other) 
    : Person(other) // <--- call Person's copy constructor. 
    , num_(other.num_) 
{ 
} 

否则Person的默认构造函数将被调用。


我似乎没有完全理解这个问题,所以我只是说一切我认为是相关的,希望这将有助于OP。

所有的用户定义的构造函数默认调用他们的基地的默认构造函数(除非他们明确地调用不同的构造函数),如果基本的默认构造函数是用户定义或编译器生成的也没关系。

当编译器生成拷贝构造函数时,它将调用基类的拷贝构造函数。

编译器定义的构造并不特别,他们可以明确地称为:

class Base { 
    int num_ 
public: 
    Base(int n) : num_(n) { } 
    // copy constructor defined by compiler 
}; 

class Derived : public Base { 
    float flt_; 
public: 
    Derived(float f, int n) : Base(n), flt_(f) { } 
    // Copy constructor 
    Derived(const Derived& other) 
     : Base(other) // OK to explicitly call compiler generated copy constructor 
     , flt_(other.flt_) 
    { 
    } 
}; 

欲了解更多详细信息,请参阅本Wikipedia article

+0

你知道,我必须明确地调用它,但这不是我的问题,我的问题是“派生类的唯一默认拷贝构造函数可以调用基类的复制构造函数(默认或用户书写)”? – 2010-01-17 20:27:54

+1

我不明白你的问题。 – Motti 2010-01-17 20:29:15

+0

只是派生类的默认拷贝构造函数可以自动调用基类的拷贝构造函数,基类的拷贝构造函数是默认拷贝构造函数还是用户写入拷贝构造函数?是否有意义? – 2010-01-17 20:33:04

1

如果您未指定复制构造函数,编译器会自动生成一个。这个构造函数的生成方式是它调用基类的复制构造函数。

如果实现拷贝构造函数自己,你还可以指定哪些基类的构造函数应使用(见Motti的回答)。如果不指定任何内容,则使用默认构造函数(这就是为什么它被称为“默认构造函数”的原因:在没有明确指定构造函数时使用它)。

所以编译器会自动生成一个合理的拷贝构造函数,但如果你想一些特别的东西没有进一步的魔术是怎么回事,你必须指定你自己怎么说的构造究竟应该像。

1
class Base { 
    int num_ 
public: 
    Base(int n) : num_(n) { } 
    // copy constructor defined by compiler 
}; 

class Derived : public Base { 
    float flt_; 
public: 
    Derived(float f, int n) : Base(n), flt_(f) { } 
    // Copy constructor 
    Derived(const Derived& other) 
     : Base(other) // OK to explicitly call compiler generated copy constructor 
     , flt_(other.flt_) 
    { 
    } 
};