【问题标题】:Call parameterised constructor after base class after some calculation在经过一些计算后在基类之后调用参数化构造函数
【发布时间】:2015-05-09 22:43:11
【问题描述】:

我希望能够在使用派生类构造函数的输入参数进行一些计算之后调用基类的参数化构造函数。

据我所知,当您调用派生类的构造函数时,会调用基类的默认构造函数...

(除非它的参数化构造函数被特别调用:)

DerivedClass(int a,int b) : BaseClass(a,b) {} 

有没有做类似的事情:

DerivedClass(int a,int b) { 
   a += 2; 
   b += 5; 
   BaseClass(a, b); // <- this line I am questioning :(
}

我假设上面的内容不起作用,因为 BaseClass 的默认构造函数已被调用..

【问题讨论】:

    标签: c++ inheritance constructor


    【解决方案1】:

    不,您不能推迟在派生构造函数中调用基构造函数。调用构造函数的唯一方法是通过构造函数初始化列表,该列表在构造函数主体之前执行。如果不是这样,您可能会看到很多噩梦般的代码,其中对象的基础部分尚未构建,但派生部分已经在尝试初始化自身......

    在你的情况下,你可以这样做

    DerivedClass(int a,int b) : BaseClass(a + 2, b + 2) {} 
    

    PS:你的代码中有一个错误,当你调用BaseClass时,你不应该使用BaseClass(int a, int b),而只能使用BaseClass(a, b),因为它是一个函数调用而不是一个声明。

    【讨论】:

    • 啊,是的,我想是的。在我的具体情况下,我对 2 个类有不同的输入参数,两个构造函数之间的唯一区别是我必须进行一些计算/操作来转换 DerivedClass 的参数才能得到 @ 的等效参数987654326@。在此 calc 之后调用 BaseClass 构造函数似乎是有意义的,否则它只是重复的代码
    • @DotSlashSlash 在另一个函数中考虑公共代码,并在您的构造函数中调用该代码。参见例如赞猞猁提案。
    • @DotSlashSlash 如果您只想增加 ab,您可以简单地使用增加的值调用 BaseClass 构造函数,请参阅更新后的编辑。
    • 嗯谢谢你的建议!烦人的是,参数类型不同,计算时间很长,而且我有很多不同的派生类,它们都进行不同的计算,这需要许多不必要的函数,这些函数只需要使用一次。也许我可以使用 lambda 函数?!但对于我的项目,我认为它有点矫枉过正,并且会保持原样。不过感谢您的信息!
    【解决方案2】:

    您不能推迟基本构造函数,但您可以使用函数。

    例如:

    DerivedClass(int a, int b) : BaseClass(adjust_a(a), adjust_b(b)) {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-26
      • 2013-01-11
      • 2012-05-02
      • 2011-08-19
      • 2017-07-30
      • 2015-08-18
      • 1970-01-01
      • 2015-05-28
      相关资源
      最近更新 更多