1.如果派生类定义了自己的构造函数(复制构造函数)或赋值操作符,该构造函数(复制构造函数)或赋值操作符一般应显式使用基类构造函数(复制构造函数)或赋值操作符初始化基类部分、
Eample:
class base
{
public:
base()
{
}
base(int i):x(i)
{
cout<<"base::constructor"<<endl;
}
base(base& other)
{
cout<<"base::copy"<<endl;
x=other.x;
}
base& operator=(base &other)
{
cout<<"base::assign"<<endl;
x=other.x;
}
int x;
};
class derived:public base
{
public:
derived()
{
}
derived(int i,int j):base(i),y(j)
{
cout<<"derived::constructor"<<endl;
}
derived(derived& other):base(other)
{
cout<<"derived::copy"<<endl;
y=other.y;
}
derived& operator=(derived& other)
{
base::operator=(other);
cout<<"derived::assign"<<endl;
y=other.y;
}
void fun()
{
cout<<"derived:\n"<<x<<ends<<y<<endl;
}
private:
int y;
};
int main()
{
derived d(1,2);//constructor
d.fun();
cout<<endl;
derived d1(d);//copy-constructor
d1.fun();
cout<<endl;
derived d2;
d2=d1; //assign
d2.fun();
return 0;
}
运行结果:
2.析构函数
*编译器总是显式调用派生类对象基类部分的析构函数,每个析构函数只负责清除自己的成员
*首先运行派生类析构函数,然后按继承层次依次向上调用各基类析构函数
Example:
class base
{
public:
~base()
{
cout<<"base::~base()"<<endl;
}
};
class derived:public base
{
public:
~derived()
{
cout<<"derived::~derived()"<<endl;
}
};
int main()
{
base *pb=new derived;
delete pb;
cout<<endl;
derived d;
return 0;
}
Output:
base::~base()
derived::~derived()
base::~base()
Example:
class base
{
public:
virtual ~base()
{
cout<<"base::~base()"<<endl;
}
};
class derived:public base
{
public:
~derived()
{
cout<<"derived::~derived()"<<endl;
}
};
int main()
{
base *pb=new derived;
delete pb;
return 0;
}
Output:
derived::~derived()
base::~base()
Eample:
class base
{
public:
base()
{
}
base(int i):x(i)
{
cout<<"base::constructor"<<endl;
}
base(base& other)
{
cout<<"base::copy"<<endl;
x=other.x;
}
base& operator=(base &other)
{
cout<<"base::assign"<<endl;
x=other.x;
}
int x;
};
class derived:public base
{
public:
derived()
{
}
derived(int i,int j):base(i),y(j)
{
cout<<"derived::constructor"<<endl;
}
derived(derived& other):base(other)
{
cout<<"derived::copy"<<endl;
y=other.y;
}
derived& operator=(derived& other)
{
base::operator=(other);
cout<<"derived::assign"<<endl;
y=other.y;
}
void fun()
{
cout<<"derived:\n"<<x<<ends<<y<<endl;
}
private:
int y;
};
int main()
{
derived d(1,2);//constructor
d.fun();
cout<<endl;
derived d1(d);//copy-constructor
d1.fun();
cout<<endl;
derived d2;
d2=d1; //assign
d2.fun();
return 0;
}
运行结果:
2.析构函数
*编译器总是显式调用派生类对象基类部分的析构函数,每个析构函数只负责清除自己的成员
*首先运行派生类析构函数,然后按继承层次依次向上调用各基类析构函数
Example:
class base
{
public:
~base()
{
cout<<"base::~base()"<<endl;
}
};
class derived:public base
{
public:
~derived()
{
cout<<"derived::~derived()"<<endl;
}
};
int main()
{
base *pb=new derived;
delete pb;
cout<<endl;
derived d;
return 0;
}
Output:
base::~base()
derived::~derived()
base::~base()
3.虚析构函数
*析构函数为虚函数,通过指针调用时,运行的析构函数将因指针所指对象类型的不同而不同从上面结果可以看出,当delete pb时,只调用了基类的析构函数,派生类定义的析构函数并没有被调用,解决办法,把基类的析构函数声明为虚析构函数
Example:
class base
{
public:
virtual ~base()
{
cout<<"base::~base()"<<endl;
}
};
class derived:public base
{
public:
~derived()
{
cout<<"derived::~derived()"<<endl;
}
};
int main()
{
base *pb=new derived;
delete pb;
return 0;
}
Output:
derived::~derived()
base::~base()