1.派生类的构造函数可以不显示式的写出基类的构造函数。例如:
Third()
{e=0;}
此时,系统自动调用基类的无参构造函数(没有,则为默认的构造函数)。也可显示式的指出调用基类的哪一个构造函数。例如:
Third(int x,int y,int z):Second(x,y)
{
e=z;
}
2.要调用的基类构造函数的参数可在派生类的构造函数中明确给出。例如:
Third(int x,int y,int z):Second(x,y)
{
e=z;
}
也可不给出:
Second():First(1,1)
{
c=0;
d=0;
}
还可以对派生类构造函数的参数进行一些交换,再传递给要调用的基类的构造函数,例如:
Second(int x,int y):First(x+1,y+1)
{
c=x;
d=y;
}
一个完整的例子如下:
#include<iostream>
using namespace std;
class First{
public:
First()
{
a=0;
b=0;
}
First(int x,int y)
{a=x;
b=y;
}
~First()
{
cout<<"destructing First"<<endl;
}
void show()
{
cout<<"\n a="<<a<<"\n b="<<b<<endl;
}
private:
int a;
int b;
};
class Second:public First{
public:
Second():First(1,1)
{
c=0;
d=0;
}
Second(int x,int y):First(x+1,y+1)
{
c=x;
d=y;
}
Second(int x,int y,int m,int n):First(m,n)
{
c=x;
d=y;
}
~Second()
{
cout<<"destructing Second"<<endl;
}
void show()
{
First::show();
cout<<"c="<<c<<"d="<<d<<endl;
}
private:
int c,d;
};
class Third:public Second{
public:
Third()
{e=0;}
Third(int x,int y,int z):Second(x,y)
{
e=z;
}
Third(int x,int y,int z,int m,int n):Second(x,y,m,n)
{
e=z;
}
~Third()
{
cout<<"destructing Third"<<endl;
}
void show()
{
Second::show();
cout<<"e="<<e<<endl;
}
private:
int e;
};
int main()
{
First f;
f.show();
cout<<"======================"<<endl;
Second d1;
d1.show();
cout<<"======================"<<endl;
Second d2(10,20,30,40);
d2.show();
cout<<"====================="<<endl;
Second d3(12,13);
d3.show();
cout<<"======================="<<endl;
Third t;
t.show();
cout<<"======================"<<endl;
Third t1(14,15,16);
t1.show();
cout<<"======================="<<endl;
Third t2(50,60,70,80,90);
t2.show();
return 0;
}

分享到:
相关推荐
派生类构造函数和析构函数的执行顺序 在面向对象编程中,继承是非常重要的一个概念。派生类可以继承基类的成员,实现代码的重复利用。但是,基类的构造函数和析构函数不能被继承。如果在派生类中需要对新增加的成员...
反之,由于`A`的析构函数是虚函数,因此在删除`B`对象时,不仅调用了基类`A`的析构函数,还调用了派生类`B`的析构函数,从而正确释放了所有资源。 ### 总结 构造函数和析构函数在C++中扮演着至关重要的角色。构造...
"高质量C++编程指南 - 第9章 类的构造函数、析构函数与赋值函数" 本章主要介绍了C++类中的三个基本函数:构造函数、析构函数与赋值函数。这些函数看似简单,但如果不正确地使用它们,可能会导致程序出错。 首先,...
与构造函数相反,析构函数的名称前带有波浪线(~),表示其与构造函数相反的功能。由于析构函数是对象生命周期的自然终点,它不返回任何值,所以没有返回类型。 赋值函数(又称赋值运算符重载)用于改变对象的状态...
与构造函数一样,析构函数也没有返回值。析构函数是自动调用的,当对象的作用域结束或者对象被删除时,析构函数会被调用。 例如: ```cpp class A { float* x; public: A(float val) : x(new float(val)) {} // ...
定义基类person,数据成员name,sex,age,构造函数,析构函数,输出...②定义公有派生类student,数据成员:num,构造函数,析构函数,输出name,sex,age,num的函数display()。③ 主函数定义并使用student 对象stu。
#### 构造函数与析构函数:C#中的生命期管理 在C#编程语言中,构造函数和析构函数是对象生命周期管理的关键部分,它们分别负责对象的初始化和清理工作。理解这两者的运作机制对于编写健壮、高效的代码至关重要。 #...
对于虚析构函数来说,虚函数表的存在使得可以根据实际对象的类型来决定调用哪个析构函数,从而实现了在对象销毁时的逆序操作:先调用派生类的析构函数,然后调用基类的析构函数,以保证派生类中新增的资源也能被正确...
总的来说,理解和掌握构造函数、析构函数(以及在Java中的`finalize()`方法)、函数的重载、类的继承以及函数覆盖,对于提升Java编程能力至关重要。同时,设计模式的运用可以提高代码的可维护性和可扩展性,使得大型...
在继承体系中,如果没有声明析构函数为虚的,那么通过基类指针或引用删除派生类对象时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能会导致资源泄露和其他未定义行为。而声明了虚析构函数后,系统会...
析构函数的执行顺序与构造函数相反。析构函数的作用是清理类的资源,释放内存和关闭文件等。 在派生类中,析构函数的执行顺序是: 1. 调用派生类的析构函数,以便清理派生类自己的成员变量。 2. 调用基类的析构...
#### 析构函数与虚函数 在C++中,析构函数用于释放对象占用的资源。虚函数则允许在派生类中重写基类中的函数,从而实现了多态性。然而,在析构函数中调用虚函数可能会引发意想不到的问题,尤其是在类继承体系中。 ...
总之,理解并熟练运用构造函数、复制构造函数、析构函数、继承、虚函数和多态性是掌握C++面向对象编程的关键。它们共同构成了C++强大而灵活的类层次结构和对象模型,为复杂软件设计提供了坚实的基础。通过深入研究和...
6. **可以是虚函数**:如果希望在派生类中覆盖基类的析构函数,则可以在基类中声明析构函数为虚函数。 #### 三、示例代码解析 下面通过给出的代码示例来详细了解析构函数的应用: ```cpp #include using ...
析构函数与构造函数相反,构造函数用于初始化对象,而析构函数则在对象生命周期结束时自动调用,负责清理对象创建过程中分配的资源。 首先,析构函数的命名遵循特定的规则,它以一个波浪线(~)作为前缀,后面跟着...
在分析给定的文件名"派生类的构造与析构.cpp"时,我们可以推测这是一个包含C++源代码的文件,其中可能包含了关于派生类构造和析构的示例代码。通过对这个文件的阅读和学习,开发者可以更直观地理解上述理论知识,并...
1、 形状(一) 编写C++程序完成以下功能: ...(4) 分别实现派生类构造函数、析构函数和其他方法; (5) 创建派生类的对象,观察构造函数、析构函数调用次序; (6) 不同对象计算面积。 北邮C++小学期作业
18. 析构函数与构造函数非共同具有的特点是允许重载。 19. 拷贝函数的作用是用一个已知对象来初始化一个被创建的同类的对象。 20. 通常拷贝构造函数的形参是一个对象的引用。 21. 假定 A 为一个类,并执行语句 A ...
类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换的内幕,虚拟函数与多...