派生类在构造时的顺序问题

class A{

A() = default ;

A( some parameters ){ print ("A"); }

}

 

class B: public A {

B( some parameters ): A( some parameters ) { print("B"); };

}

 

可以确定的是:

B的base部分先被构造,然后才是B的派生类部分被构造完成

有疑问的是:

究竟是B的构造函数先被调用还是B的构造函数中的A( some parameters )先被调用?

根据C++ Primer 第五版书中所写(页码位置待补充)

应该是A( some parameters )先被调用

问题来了,如果B没有被调用,some parameters是怎么传入A( some parameters )中的呢?

根据实验,确实是"A"比"B"先打印出来

那么怎么理解这种矛盾呢?

 

只能说明 构造函数初始化列表  不算是“调用”

构造函数初始化列表算是发生在函数调用前,是一种准备工作

其中的思想也许类似循环,循环开头可能有一些初始化和循环条件,符合条件才会“进入”循环 

在做这些初始化和检查循环条件时,不算是“进入”了循环

 

真正走到B的构造函数的花括号当中的时候,才算是“调用”了

以上为个人理解

网上也有相反观点认为书中的陈述就是错的

posted @ 2020-04-27 21:13  灰雾核心  阅读(155)  评论(0)    收藏  举报