1. 顺序
当创建一个派生类的对象时,系统首先自动创建一个基类对象,也就是说,在调用派生类构造函数创建派生类对象之前,系统首先调用基类的构造函数创建基类对象。当派生类对象生命期结束时,首先调用派生类的析构函数,然后调用基类的析构函数。简而言之,就是说,构造函数:基类->派生类。析构函数:派生类->基类。
这个我们完全可以通过一个小程序来说明:
//通过输出就可以看出在创建派生类对象b1时各个函数的调用顺序了
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A(Based Class) constructor is called"<<endl;
}
~A()
{
cout<<"A(Based Class) destructor is called"<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"B(Derived Class) constructor is called"<<endl;
}
~B()
{
cout<<"B(Derived Class) destructor is called"<<endl;
}
};
int main()
{
B b1;
return 0;
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A(Based Class) constructor is called"<<endl;
}
~A()
{
cout<<"A(Based Class) destructor is called"<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"B(Derived Class) constructor is called"<<endl;
}
~B()
{
cout<<"B(Derived Class) destructor is called"<<endl;
}
};
int main()
{
B b1;
return 0;
}
OutPut:
2. 通过派生类的构造函数调用基类的构造函数有两种方式,隐式和显式两种。所谓隐式方式就是在派生类的构造函数中不指定对应的基类的构造函数,这个时候调用的是基类的默认构造函数(即含有默认参数值或不带参数的构造函数)。而所谓显式方式,就是在派生类的构造函数中指定要调用的基类的构造函数,并将派生类构造函数的部分参数值传递给基类构造函数。注:除非基类有默认的构造函数,否则必须采用显式调用方式。
下面分别给出一个隐式和显式调用的例子:
#include <iostream>
using namespace std;
class A
{
public:
A(int x = 0,int y = 0)
{
a = x;
b = y;
}
private:
int a;
int b;
};
//基类A有默认的构造函数,可以隐式调用
class B:public A
{
public:
B(int z = 0)
{
c = z;
}
private:
int c;
};
int main()
{
B b1;
return 0;
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using namespace std;
class A
{
public:
A(int x = 0,int y = 0)
{
a = x;
b = y;
}
private:
int a;
int b;
};
//基类A有默认的构造函数,可以隐式调用
class B:public A
{
public:
B(int z = 0)
{
c = z;
}
private:
int c;
};
int main()
{
B b1;
return 0;
}
显式调用的例子:
#include <iostream>
using namespace std;
class A
{
public:
A(int x,int y)
{
a = x;
b = y;
}
private:
int a;
int b;
};
//基类A没有默认的构造函数,其现有的构造函数需要传递参数,通过
//派生类构造函数调用A构造函数时必须如下显式调用
class B:public A
{
public:
B(int x,int y,int z):A(x,y)
{
c = z;
}
private:
int c;
};
int main()
{
B b1(1,2,3);
return 0;
}
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using namespace std;
class A
{
public:
A(int x,int y)
{
a = x;
b = y;
}
private:
int a;
int b;
};
//基类A没有默认的构造函数,其现有的构造函数需要传递参数,通过
//派生类构造函数调用A构造函数时必须如下显式调用
class B:public A
{
public:
B(int x,int y,int z):A(x,y)
{
c = z;
}
private:
int c;
};
int main()
{
B b1(1,2,3);
return 0;
}
相关推荐
在C++中,有两种方式在派生类构造函数中调用基类构造函数: 1. 显式使用`base_class::constructor`语法: 派生类构造函数的初始化列表中可以直接指定基类的构造函数,如: ```cpp class Derived : public Base {...
派生类构造函数和析构函数的执行顺序 在面向对象编程中,继承是非常重要的一个概念。派生类可以继承基类的成员,实现代码的重复利用。但是,基类的构造函数和析构函数不能被继承。如果在派生类中需要对新增加的成员...
当一个类是另一个类的基类时,基类的构造函数会在派生类构造函数之前被调用。这是为了确保基类的部分首先被正确初始化。基类的构造函数可以通过派生类的成员初始化列表来指定: ```cpp class Base { public: ...
在C++编程语言中,派生类是面向对象编程中的一个重要概念,它是通过继承基类的属性和方法来...在实际开发中,正确地使用派生类构造函数可以提高代码的复用性,减少重复代码,并有助于构建更加灵活和模块化的软件结构。
* 本实验中,person 类和 student 类的成员函数包括构造函数、输出函数和计算函数。 知识点七:程序设计 * 程序设计是面向对象程序设计的最后一步骤,需要将类的设计和实现结合起来。 * 本实验中,main() 函数是...
3. 类的继承体系中,基类和派生类构造函数之间的关系:在派生类的构造函数中,需要显示调用基类的构造函数,以确保基类的成员变量被正确初始化。 4. 类的继承体系中,基类和派生类析构函数之间的关系:在派生类的析...
2. 深拷贝与浅拷贝:在派生类构造函数中,如果子对象是其他类的引用或指针,需要确保正确处理深拷贝和浅拷贝问题,以防止意外的数据共享或丢失。 五、使用初始化列表 成员初始化列表是构造函数体之外的一段代码,...
在派生类的构造函数中,需要使用基类的构造函数名,后面括号内的参数表列中包括基类构造函数所需的参数和对派生类新增的数据成员初始化所需的参数。例如,`Student1(int n, string nam, char s, int a, string ad):...
描述提到这是一个小型的实例,主要展示了类的派生以及基类和派生类构造函数之间的关系。这样的例子通常包括创建基类,定义派生类,并在派生类中调用基类的构造函数,以确保初始化过程的正确执行。 在派生类中,有几...
BaseClass中包含了两个构造函数,一个无参数的构造函数和一个带有int参数的构造函数。无参数的构造函数输出“子类调用基类的第一个构造函数”,而带有int参数的构造函数输出“子类调用基类的第二个构造函数”。 在...
9. **简化构造函数**:如果所有基类和子对象的构造函数都可以省略,且派生类无需额外参数,成员初始化列表可以省略,派生类构造函数可以写得更简洁。 10. **无参构造函数**:如果基类和子对象的构造函数都不需要...
这个实例"向基类构造函数传递参数"将深入探讨如何在派生类中调用基类的构造函数,并传递参数以实现更灵活的代码设计。以下是对这个主题的详细讲解: 首先,让我们理解什么是多态性。多态性(Polymorphism)是指一个...
构造函数不能被继承,所以,一个派生类的构造函数必须通过调用基类的某个构造函数来初始化基类子对象。派生类的构造函数只负责初始化在派生类中声明的数据成员。 基类与派生类对象示意图 基类与派生类对象的关系...
虚基类的特性使得派生类在内存布局上有所不同,同时也影响了构造函数和析构函数的调用顺序。 总的来说,理解和熟练掌握基类与派生类之间的转换,以及如何使用虚基类,对于编写高效且健壮的C++代码至关重要。这些...
构造函数和析构函数在派生类中的执行顺序须知 在面向对象编程中,构造函数和析构函数是非常重要的概念,特别是在派生类中,它们的执行顺序直接影响了类的正确初始化和清理。在本文中,我们将讨论构造函数和析构函数...
题目:设计基类点类(Point)、直接派生类圆类(Circle)、间接派生类圆柱体类(Cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数调用,输出点类、圆类和圆柱体类面积。提示:其他数据成员和...
在这个编程任务中,我们需要创建两个类,一个基类 `Rectangle` 表示矩形,一个派生类 `Cube` 表示正方体。以下是详细的知识点解释: 1. **基类 Rectangle** - `Rectangle` 类有四个私有成员变量 `x1`, `y1`, `x2`,...
主要介绍了C#中派生类调用基类构造函数用法,实例分析了派生类调用基类构造函数的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
在C++编程语言中,继承是一种非常重要的面向对象编程特性,它允许我们定义一个类(派生类)从另一个类(基类)那里继承属性和方法。这种机制使得代码更加模块化、可重用,并有助于创建更加清晰、易于理解的类层次...