c ++是不是可以在不基于其基类的派生类中创建构造函数?

Posted

技术标签:

【中文标题】c ++是不是可以在不基于其基类的派生类中创建构造函数?【英文标题】:c++ Is it possible to create a constructor in a derived class that is not based on its base class?c ++是否可以在不基于其基类的派生类中创建构造函数? 【发布时间】:2020-08-21 11:30:08 【问题描述】:

执行下面的代码会给 Child()/**........code*/ 行一个错误,说:没有匹配函数调用 'Base::Base()' 并且候选 Base::Base(int) 需要 1 个参数,但没有提供。

class Base


public:
    Base(int test)
    

    ;

;

class Child : public Base


public:
    Child ()
    
        /**....
           ....
           code*/
    ;
    Child(int test):Base(test)
    

    ;
;

所以我想知道是否有办法在派生类中使用构造函数 - 例如:Child(); - 与其基类没有任何关联。

【问题讨论】:

我想最简单的方法是给你的子类 BASE cunstructor 并交出一些虚拟值,或者你需要创建一个 base:base() 构造函数 【参考方案1】:

没有。

根据您的定义,Child 继承自 Base,如果没有 Base 子对象,则无法创建 Child

相反,您应该提供一个参数(任何一个好的默认值):

Child() : Base(42) ;

另外,Base 可以提供一个默认构造函数(可以不带参数调用的构造函数),即

class Base 
public:
    Base(int test = 42) ;    
;

那么你的Child 就可以了。

【讨论】:

【参考方案2】:

您仍然需要调用用户定义的构造函数。但是,如果您的应用程序可以容忍,您可以向它传递一个虚拟参数。否则,这是糟糕的应用程序设计,稍后会在某个地方出现问题。

class Child : public Base


public:
    Child ()
         : Base(0)
    
        /**....
           ....
           code*/
    ;
    Child(int test):Base(test)
    

    ;
;

【讨论】:

以上是关于c ++是不是可以在不基于其基类的派生类中创建构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

派生类的构造函数与析构函数的调用顺序

c ++如何在原始抽象类中创建一个接受派生类输入的函数

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?

C++学习21 基类和派生类的赋值

c++ 析构函数 是在啥时候执行

C#winform中为啥一个窗体的对象可以调用在另一个窗体中创建的一个类未实例化下