为了账号安全,请及时绑定邮箱和手机立即绑定

调用超类构造函数的规则是什么?

调用超类构造函数的规则是什么?

C++
沧海一幻觉 2019-06-14 16:08:27
调用超类构造函数的规则是什么?从子类调用超类构造函数的C+规则是什么?例如,我知道在Java中,您必须将其作为子类构造函数的第一行(如果不这样做,则假定对no-Arg超级构造函数的隐式调用-如果缺少,则会给您一个编译错误)。
查看完整描述

3 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

如果基类构造函数没有参数,则会自动调用它们。如果要调用带有参数的超类构造函数,则必须使用子类的构造函数初始化列表。与Java不同,C+支持多重继承(无论是好是坏),因此基类必须按名称引用,而不是“Super()”。

class SuperClass{
    public:

        SuperClass(int foo)
        {
            // do something with foo
        }};class SubClass : public SuperClass{
    public:

        SubClass(int foo, int bar)
        : SuperClass(foo)    // Call the superclass constructor in the subclass' initialization list.
        {
            // do something with bar
        }};

构造函数初始化列表的更多信息这里这里.


查看完整回答
反对 回复 2019-06-14
?
月关宝盒

TA贡献1772条经验 获得超5个赞

在C+中,在输入构造函数之前,将为您调用所有超类和成员变量的无参数构造函数。如果要传递参数,则有一个单独的语法,称为“构造器链接”,如下所示:

class Sub : public Base{
  Sub(int x, int y)
  : Base(x), member(y)
  {
  }
  Type member;};

如果在此点运行任何内容,则调用以前已完成构造的基/成员的析构函数,并将异常重新抛出给调用方。如果要在链接期间捕获异常,则必须使用函数try块:

class Sub : public Base{
  Sub(int x, int y)
  try : Base(x), member(y)
  {
    // function body goes here
  } catch(const ExceptionType &e) {
    throw kaboom();
  }
  Type member;};

在这种形式中,请注意try块函数的主体,而不是在函数的主体内;这允许它捕获隐式或显式成员和基类初始化引发的异常,以及在函数正文期间抛出的异常。但是,如果函数CATCH块不抛出不同的异常,运行库将重新抛出原始错误;初始化期间出现异常。不可能被忽视。


查看完整回答
反对 回复 2019-06-14
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

在C+中,有一个构造函数初始化列表的概念,它是您可以并且应该调用基类构造函数的地方,也是您应该初始化数据成员的地方。初始化列表在冒号后面的构造函数签名之后,在构造函数主体之前。假设我们有一个A班:

class A : public B{public:
  A(int a, int b, int c);private:
  int b_, c_;};

然后,假设B有一个接受int的构造函数,A的构造函数可能如下所示:

A::A(int a, int b, int c) 
  : B(a), b_(b), c_(c) // initialization list{
  // do something}

如您所见,基类的构造函数在初始化列表中调用。顺便说一下,初始化列表中的数据成员比在构造函数主体内分配b_和c_值更好,因为这样可以节省额外的赋值成本。

请记住,数据成员总是按照类定义中声明的顺序进行初始化,而不管它们在初始化列表中的顺序如何。为了避免出现奇怪的错误,如果数据成员相互依赖,则应该始终确保成员的顺序在初始化列表和类定义中是相同的。出于同样的原因,基类构造函数必须是初始化列表中的第一项。如果完全忽略它,则将自动调用基类的默认构造函数。在这种情况下,如果基类没有默认构造函数,则会得到编译器错误。


查看完整回答
反对 回复 2019-06-14
  • 3 回答
  • 0 关注
  • 808 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信