分为两种情况:
第一种情况,如果派生类中不适用new,这样的话就不需要定义显式析构函数、拷贝构造函数、重载赋值操作符
第二种情况,如果派生类中使用new,则必须定义显式析构函数、拷贝构造函数、重载赋值操作符,而且在这三个函数中都必须使用基类的方法来处理基类中的元素,比如在子类中重载赋值操作符,如果不显式调用基类的重载赋值操作符,就会递归调用子类的重载操作符。
class baseClass{
public:
baseClass(){
name = new char[1024];
}
baseClass(const char *str){
name = new char[1024];
strcpy(name, str);
name[strlen(str)] = '\0';
}
baseClass(const baseClass &another){
name = new char[1024];
strncpy(name,another.name,strlen(another.name));
name[strlen(another.name)] = '\0';
}
baseClass &operator=(const baseClass &another){
if (this == &another)
{
return *this;
}
delete[] name;
//name = new char[strlen(another.name) + 1];
name = new char[1024];
strncpy(name, another.name, strlen(another.name));
name[strlen(another.name)] = '\0';
return *this;
}
~baseClass(){
if (NULL != name)
{
delete[] name;
name = NULL;
}
}
public:
char *name;
};
class childClass:public baseClass{
public:
childClass(){
address = new char[1024];
}
childClass(const char *str,const char *str2){
address = new char[1024];
strcpy(name, str2);
strcpy(address, str);
address[strlen(str)] = '\0';
name[strlen(str2)] = '\0';
}
//使用父类对象的构造函数
childClass(const char *str, const baseClass &parent):baseClass(parent){
address = new char[1024];
strcpy(address, str);
address[strlen(str)] = '\0';
}
//子类执行拷贝构造函数之前先执行弗雷的拷贝构造函数
childClass(const childClass &another):baseClass(another){
address = new char[strlen(another.address) + 1];
strcpy(address, another.address);
address[strlen(another.address)] = '\0';
}
childClass &operator=(const childClass &another){
if (this == &another)
{
return *this;
}
//必须显示调用父类的重载等号操作符,否则会导致递归调用问题
baseClass::operator=(another);
delete[] address; //使用之前必须清空
address = new char[1024];
strcpy(address,another.address);
address[strlen(another.address)] = '\0';
return *this;
}
~childClass(){
if (NULL != name)
{
delete[] name;
name = NULL;
}
if (NULL != address)
{
delete[] address;
address = NULL;
}
}
public:
char *address;
};