子类复制构造函数的编写问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 11:56:30
又如下程序
#include <iostream>

using namespace std;

class Mammal
{
public:
Mammal():itsAge(99){cout<<"Mammal constructor...\n";}
virtual ~Mammal(){cout<<"Mammal destructor...\n";}
Mammal(const Mammal & rhs);
virtual void Speak() const{cout<<"Mammal speak!\n";}
virtual Mammal* Clone(){return new Mammal(*this);}
int GetAge() const{return itsAge;}
int itsAge;
};

Mammal::Mammal(const Mammal & rhs):itsAge(rhs.GetAge())
//---->问题1.如果自己编写复制构造函数,是不是要将类的变量全部手工复制
//以求覆盖默认复制构造函数的功能?如果不复制是否就出现编译错误了?
//(貌似确实如此...)
{
cout<<"Mammal Copy Constructor...\n";
}

class Dog:public Mammal
{
public:
Dog(){cout<<"Dog constructor...\n";}
virtual ~Dog(){cout<<"Dog destructor...\n";}
Dog(const Dog & rhs);
void Speak() const

1、没有必要。事实上复制构造函数,和operator=需要不需要重载,要看成员变量是不是一个简单的值类型。如果是int,float等简单值类型,系统会自动复制。但是,如果是一个int *, char *之类的指针,那就需要自己构造。因为,如果你不自己构造,则这个指针会被系统简单的复制,这样两个对象就会指向同一个地方。当在一个对象内把所指向的东西被销毁,则另一个对象所指向的内容就没有意义了。

2、如果基类也需要复制构造的话,就需要写出来。需不需要见1.

3、如果基类有默认构造函数,则系统会自动调用。否则如果不手工写出基类的构造,则会提示编译错误。
如下:
class A
{
public:
A( int b, int c ) {}
};
class B
{
public: B() : A( 0, 0 ) {}
};

1.不是的,你可以使用继承,继承父类
2.要写出,系统不自动编译
3.同理

1. 一旦自己写了复制构造函数,编译器就不再提供默认构造函数,因此的确应该自己实现默认构造函数的功能(如果需要的话)。
2. 构造派生类的对象必须先调用基类的构造函数,如果基类没有默认构造函数,就必须用冒号语法显式调用。否则隐式调用基类的默认构造函数。
3. 和上面说法一样。