公有继承基类和派生类之间构造和析构、赋值和拷贝构造函数的关系(上)
1、公有继承基类和派生类之间构造函数的关系
如果一个类Text在公有继承了Object类,在创建一个Text对象t时会先调用Object的构造函数,然后再调用Text的构造函数,不论Text的形参列表声明中Object的声明在前在后。
代码测试:
#include<iostream>
using namespace std;
class Object
{
private:
int val;
public:
Object(int a=0) :val(a)
{
cout<<"construct Object"<<endl;
}
} ;
class Text :public Object
{
private:
int num;
public:
Text(int b=0) :num(b),Object(b+10)
{
cout<<"construct Text"<<endl;
}
};
int main()
{
Text t(10);
return 0;
}
测试结果:
2、公有继承基类和派生类之间析构函数的关系
和构造函数相反,如果类Text在公有继承了Object类,在析构一个Text对象t时,会先调用Object的析构函数,然后再调用Text的析构函数。
代码测试:
#include<iostream>
using namespace std;
class Object
{
private:
int val;
public:
Object(int a=0) :val(a)
{
cout<<"construct Object"<<endl;
}
~Object()
{
cout<<"destory Object"<<endl;
}
} ;
class Text :public Object
{
private:
int num;
public:
Text(int b=0) :num(b)
{
cout<<"construct Text"<<endl;
}
~Text()
{
cout<<"destory Text"<<endl;
}
};
int main()
{
Text t(10);
return 0;
}
测试结果:
2、公有继承基类和派生类之间赋值函数的关系
如果类Text在公有继承了Object类,把Text对象t2赋值给Text对象t1,在没有给出operator=函数的情况下,系统会抓取t1、t2的地址,把t2按位复制到t1,此时t1和t2里的数据完全相同;如果Object类中给出了operator=函数,子类Text也会自动生成相应的operator=函数,也能完成t2对t1的赋值;如果子类Text在类中给出了operator=函数,不管父类Object中有没有operator=函数,如果没在子类Text的operator=函数中调用父类Object中的operator=函数,那么t1对象中父类的那部分将不会发生改变,要在子类Text的operator=函数中调用父类Object中的operator=函数才能完成t1对象中父类部分的赋值。
下面给出基类、派生类都给出operator=函数的完全赋值:
#include<iostream>
using namespace std;
class Object
{
private:
int val;
public:
Object(int a=0) :val(a)
{
cout<<"construct Object"<<endl;
}
~Object()
{
cout<<"destory Object"<<endl;
}
Object& operator=(const Object& obj)
{
if(this!=&obj)
{
val=obj.val;
}
cout<<"operator= Object"<<endl;
return *this;
}
void showObject()
{
cout<<val<<endl;
}
} ;
class Text :public Object
{
private:
int num;
public:
Text(int b=0) :num(b),Object(b+10)
{
cout<<"construct Text"<<endl;
}
~Text()
{
cout<<"destory Text"<<endl;
}
Text& operator=(const Text& t)
{
if(this!=&t)
{
Object::operator=(t);
num=t.num;
}
cout<<"operator= Text"<<endl;
return *this;
}
void showText()
{
cout<<num<<endl;
}
};
int main()
{
Text t1(10);
t1.showObject();
t1.showText();
Text t2(20);
t1=t2;
t1.showObject();
t1.showText();
t2.showObject();
t2.showText();
return 0;
}