当前位置:文档之家› c++单继承的构造函数与析构函数

c++单继承的构造函数与析构函数


Point3D(void)
{ z=0; cout<<"new 3D"<<endl;}
……... 如果使用基类的无
~{Pcooiuntt<3参<D"(数f)re构e 3造D"函<<数en,dl;可}
};
以省略不写。
main() {
Point3D *pt; pt=new Point3D(1,2,3); ...... delete pt; } 运行结果: new 2D new 3D free 3D free 2D
class data { int x;
派生类构造函数 public:
data(int x)
范例2 { data::x=x;
printf("class data\n"); } int getx(){return x;} }; class a { data d1; public:
class c:public b { public:
c(int x):b(x) { printf("class c\n");} }; int main(int argc, char* argv[]) { c c1(10);
printf("%d %d\n",c1.getdataa(), c1.getdatab());
printf("Hello World!\n"); return 0; }
class a class data class b class c
int getdatab(){return d2.getx();} };
10 10 Hello world!
派生类的析构函数
派生类的析构函数的构造规则
当派生类中包含使用new和delete运算符的指针成员时, 派生类必须显示定义析构函数
B's default constructor called.
A's default constructor called.
A's default constructor called.
B's default constructor called.
2021/2/23
A's constructor called. A's constructor called. B's constructor called. B's deconstructor called. A's deconstructor called. A's deconstructor called. A's constructor called. A's constructor called. B's constructor called. B's deconstructor called. A's deconstructor called. A's deconstructor called.
{ ......
}
class Point2D
{
private:
int x, y;
public :
Point2D(int x0, int y0)
{x=x0; y=y0; cout<<"new
2D"<<endl;}
Point2D(void)
{x=0; y=0; cout<<"new
2D"<<endl;}
cout << “\n平均分数: ” << average<< “\n年级: " << level; }
~A() {cout<<"A's destructor called."<<endl; }
void Print() const{cout<<a<<",";}
int Geta( )const { return a; }
private:
int a;
};
14
2021/2/23
class B:public A {
派生类构造函数
范例(续)
class derive1:base { int x2,y2;
A aa; public: derive1(int a,int b,int c,int d,int e); void print() {cout<<"drive1 "<<x2<<","<<y2<<endl;} }; derive1::derive1(int a,int b,int c,int d,int e):ase(c,d),aa(e) { x2=a;y2=b;cout<<"derive1 Cons\n";} void main() { derive1 d1(1,2,3,4,5); d1.print(); }
public: B() { b=0; cout<<"B's default constructor
called.\n"; } B(int i,int j,int k); ~B() { cout<<"B's destructor
called."<<endl; } void Print()const;
private: int b; A aa;
16
void main() {
B bb[2]; bb[0]=B(1,2,5); bb[1]=B(3,4,8); for(int i=0; i<2; i++)
bb[i].Print(); }
运行结果:
A's default constructor called.
A's default constructor called.
派生类的析构函数
范例(续) class derive1:base { int x2,y2; A aa; public: derive1(int a,int b,int c,int d,int e); void print() {cout<<"drive1 "<<x2<<","<<y2<<endl;} ~derive1() {cout<<"derive1 Desc\n";} }; derive1::derive1(int a,int b,int c,int d,int e):base(c,d),aa(e) { x2=a;y2=b;cout<<"derive1 Cons\n";} void main() { derive1 d1(1,2,3,4,5); d1.print(); }
~university( ) { if (name) delete name;}
void print( ) {
cout << “\n\n姓名: ” <<name<<“\n年龄: " << age << “\n性别: "<< sex;
} }; class student: public university { protected :
17
课堂练习:大学人员类
university name age sex print
student average level print
staff dept bonus print
#include<iostream.h> #include<string.h> class university {
派生类的构造函数与析构函数
基类往往有构造函数和析构函数,但它们不能被 派生类继承。
当创建一个派生类对象时,如何调用基类的构造 函数,在结束派生类的对象时,如何调用基类的 析构函数?
派生类构造函数
派生类构造函数的定义格式
<构造函数名>(参数表):<基类构造函数>(参数表), <对象成员名1>(参数表),..., <对象成员名n>(参数表)
派生类的析构函数 范例(续)
注意析构函 数执行顺序
#include <iostream>
2021/2/23
using namespace std;
class A
{
public:
A() { a=0;cout<<"A's default constructor called.\n"; }
A(int i) { a=i;cout<<"A's constructor called.\n"; }
派生类构造函数 范例(续)
注意构造函 数执行顺序
派生类构造函数
派生类构造函数的说明 若基类使用带缺省参数的构造函数或使用无参数的构 造函数,则在定义派生类构造函数时,可略去“<基类构 造函数>(参数表)”。 在下面的两种情况下,必须定义派生类的构造函数: 派生类本身需要构造函数; 创建派生类对象时,当基类含有带参数的构造函数 时,派生类必须定义构造函数,以提供把参数传递 给基类构造函数的途径。 在定义派生类对象时,构造函数的执行顺序是:先长辈 (基类),再客人(对象成员),后自己(派生类本身)。
派生类构造函数
范例
class A {
相关主题