C++语言笔记系列之十三——派生类构造函数的调用

1.派生类构造函数的调用

(1)一个基类的所有数据成员均被派生类继承。创建一个派生类对象时,系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间。

(2)一个派生类对象在创建时不仅要调用派生类构造函数,而且要调用基类构造函数。

派生类中的数据成员在派生类中构造。

基类中的数据成员在基类中构造。

原因:

A.构造函数不继承。

B.派生类的构造函数必须通过调用基类的构造函数完成基类数据成员的初始化。

C.若派生类中含有子对象,必须调用子对象的构造函数。

2.派生类的构造函数

派生类名(总参数表):基类构造函数(参数名),子对象名(参数表) {派生类数据成员的初始化}

注:总参数表由基类、子对象、派生类三部分的参数构成;基类参数表为基类数据成员。

3.例子

example 1:

class A

{

public:

A() {cout<<"A consturct."<<endl;}

};

class B:public A

{

public:

B():A() {cout<<"B construct."<<endl;}

};

int main()

{

B b;

}

程序输出:A construct.

B construct.

说明:派生类构造函数的调用顺序:先调用基类构造函数-->调用子对象的构造函数-->派生类的构造函数。

注意:如果是多继承(class C:public A,public B),这种情况调用构造函数的顺序是按照继承列表的先后来调用,与C的构造函数中参数列表排列顺序无关。

example 2:

#include <iostream.h>

class A

{

public:

A() {"cout<<"A construct1."<<endl;}

A(int i)

{

x1 = i;

cout<<"A construct2."<<endl;

}

private:

int x1;

};

class B:public A

{

public:

B() {cout<<"B construct1."<<endl;}

B(int i):A(i+10)

{

x2 = i;

cout<<"B construt2."<<endl;

}

void displayb() {cout<<"x2 = "<<x2<<endl;}

private:

int x2;

};

int main()

{

B b(2);

b.displayb();

}

程序输出:

A construct2.

B construct2.

x2 = 2

注:派生类对象构造函数在调用之前必须先调用基类构造,派生类构造函数中要表示对基类构造的调用,若是单一继承,派生类构造函数中可以省去基类构造,但是默认会调用无参构造(建议不要省去)。

上述程序稍作修改:

将类B中的displayb修改为

void displayb()

{

displaya();

cout<<"x2 = "<<x2<<endl;

}

程序输出变为:

A construct2.

B construct2.

x1 = 12

x2 = 2

如果将main函数修改为:

int main()

{

B b(2);

b.displaya();

b.displayb();

}

程序输出变为:

A construct2.

B construct2.

x1 = 12

x2 = 2

C++语言笔记系列之十三——派生类构造函数的调用

时间: 2024-10-24 17:53:09

C++语言笔记系列之十三——派生类构造函数的调用的相关文章

C++语言笔记系列之十七——虚基类

1.虚基类 考虑这样一种情况:当某个类的部分或者全部直接基类是另一个共同基类派生而来,这些直接基类从上一级基类继承而来的成员就一定拥有相同的名称,这样就会产生二义性问题. 解决办法:当派生类和直接基类产生了二义性问题-->加类的作用域. 当派生类和间接基类产生了二义性问题-->虚基类. 2.虚基类的说明: class 派生类名:virtual 访问权限 基类名 {派生类定义}; 注意:在定义派生类时将需要继承的基类进行虚化声明,虚基类的说明在派生类的定义中完成. 作用:将基类说明为虚基类之后,

C++语言笔记系列之十六——赋值兼容规则&amp;多继承的二义性

1.赋值兼容规则 (1)派生类对象可以给基类对象赋值,这种情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:但是不允许将一个基类的对象赋值给一个派生类. (2)可以将派生类对象的地址赋给基类指针,使基类指针指向派生类对象,通过基类指针引用成员时只可以引用派生类从基类继承而来的成员,而不允许引用派生类的新成员. (3)引用与指针相同. 2.多继承 (1)一个派生类从两个以上的基类中去继承. (2)说明: class 派生类名:继承方式 基类1, 继承方式 基类2,...... {派生类成员

派生类构造函数的定义和使用举例

1.派生类构造函数的一般形式为: 派生类构造函数名(总参数表):基类构造函数名(参数表) { 派生类中新增加数据成员初始化语句 } 2.在建立一个对象时,执行构造函数的顺序是: a.派生类构造函数先调用基类构造函数: b.再执行派生类构造函数本身(即派生类构造函数的函数体) 3.在派生类对象释放时,先执行派生类析构函数,再执行其基类析构函数 例:定义一个简单的派生类构造函数. 解:程序: #include<iostream> #include<string> using names

C++语言笔记系列之十五——派生类、基类、子对象的构造和析构函数调用关系

例子 example 1 注:若一个基类同时派生出两个派生类,即两个派生类从同一个基类继承,那么系统将为每一个简历副本,每个派生类独立地使用自己的基类副本(比如基类中有属于自己类的静态变量等). #include <iostream.h> class Person { public: person() {cout<<"Construction of person."<<endl;} ~person() {cout<<"Destr

C++语言笔记系列之十二——C++的继承

C++的继承 1.继承方式 public(公有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象只能访问基类的public成员. protected(保护继承),private(私有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象不能访问基类的任何成员. 2.例子 example 1: #include <iostream.h> clas

C++语言笔记系列之十八——虚函数(1)

1.C++中的多态 (1)多态性:同一个函数的调用可以进行不同的操作,函数重载是实现多态的一种手段. (2)联编:在编译阶段进行联接,即是在编译阶段将一个函数的调用点和函数的定义点联接起来. A.静态联编:在编译阶段就完成的函数联编--函数重载. B.动态联编:在程序的运行阶段由系统自动选择具体的函数--虚函数. 注:C++的多态主要指的就是动态联编. 2.虚函数 (1)虚函数是在函数的定义时将其声明为虚函数即可. (2)说明:virtual 数据类型 函数名(参数表) {函数体} A.目的:当

C++语言笔记系列之十四——继承后的访问权限

1.析构函数不继承:派生类对象在析构时,基类析构函数的调用顺序与构造函数相反. 注:派生类对象建立时要调用基类构造函数,派生类对象删除时要调用基类析构,顺序与构造函数严格相反. 2.例子 example 1 #include <iostream.h> #include <math.h> class Point { public: Point(double a, double b, doule c) { x = a; y = b; z = c; } double Getx() {re

C++语言笔记系列之十九——虚函数(2)

1.构造函数和析构函数中调用虚函数 (1)采用静态编译. (2)在编译阶段自动联接自己类中的函数或基类中的函数,不在派生类中重定义一个函数. 注:构造函数和析构函数中调用的虚函数,派生类都不一定存在的情况下,只能去调用基类或者自身的函数. example 1 #include <iostream.h> class A { public: A() {} virtual void func() {cout<<"A construction."<<endl

C++语言笔记系列之十——静态成员

1.静态成员 (1)由关键字static修饰 静态变量定义语句在编译阶段就执行,运行过程中不再执行. (2)分类:静态数据成员.静态成员函数. (3)静态成员时类的所有对象共享的成员,而不是某一个对象的成员. 2.静态成员的使用 (1)在定义说明前加上static关键字.例如: static int x: (2)静态数据成员必须进行初始化,并且初始化必须在类外完成. (3)静态数据成员的初始化 数据类型 类名::静态数据成员名 = 值://注意这里没有static出现 (4)绝对不能使用对象名来