如果子类未定义构造函数,是不是会调用父构造函数?

Posted

技术标签:

【中文标题】如果子类未定义构造函数,是不是会调用父构造函数?【英文标题】:Are parent constructors called if a child class does NOT define a constructor?如果子类未定义构造函数,是否会调用父构造函数? 【发布时间】:2012-10-18 08:27:58 【问题描述】:

php Constructors and Destructors documentation 中声明

注意:如果子类不隐式调用父构造函数 定义了一个构造函数。为了运行父构造函数,调用 子构造函数中的 parent::__construct() 是必需的。

但是如果子类不调用构造函数,还会调用父构造函数吗?还是我们应该创建一个调用父构造函数的构造函数?

IE:

class BaseClass 
   function __construct() 
       print "In BaseClass constructor\n";
   


class SubClass extends BaseClass 
   function __construct() 
       parent::__construct();
   

【问题讨论】:

【参考方案1】:

也许这有点明显,但做了一些环顾四周,令人惊讶的是,这个问题的直接答案并不容易找到,所以这里是:

如果子类定义了一个构造函数,那么父构造函数就会被调用。

在下面的示例中,$obj 仍然会从 BaseClass 调用构造函数,因为 SubClass 从未调用过构造函数。

class BaseClass 
    function __construct() 
       print "In BaseClass constructor\n";
    


class SubClass extends BaseClass 
    //I do not have a constructor :(


$obj = new SubClass();

【讨论】:

也许the manual 最近更新了,但它确实声明,“如果子类没有定义构造函数,那么它可能像普通类方法一样从父类继承(如果它未声明为私有)。” 你甚至可以将构造函数声明为私有的吗?这似乎违背了最初开设课程的目的。 @eggmatters:检查私有构造函数的答案:***.com/a/2816139/1488445【参考方案2】:

考虑到构造函数是一种可以像任何其他方法一样被覆盖的方法。如果父类有构造函数,它的所有子类都将继承该构造函数。如果子代重写构造函数,则在创建新对象时将使用 this,并且不会隐式调用父代的构造函数。如果子级没有覆盖构造函数,则将使用父级的构造函数。这个概念适用于多重继承。

【讨论】:

以上是关于如果子类未定义构造函数,是不是会调用父构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

C++中,子类会继承父类的虚函数表!对于父类的析构函数(虚函数) 也会继承吗?

子类都会首先调用父类的构造函数吗?

构造函数和析构函数的区别

牛客网刷题知识汇总2

子类为啥要调用父类的构造函数

构造函数和析构函数