c++11之继承构造函数的理解

一、理解:
继承构造函数,继承基类的构造函数,并且以基类的构造函数为模子,构造子类自己的构造函数。怎么理解?
1.继承基类的构造函数;利用此特性,可以使得基类的构造函数在子类被继承。
2.以基类的构造函数为模子,构造子类自己的构造函数;基于基类构造函数的声明,在子类构造同样的声明,只是函数名不一致罢了。这就导致一个问题,如果多基类中,构造函数声明是一致的,那么将导致子类重复构造。怎么解决此问题呢?将在解释1进行阐述。

二、应用
1.既然涉及到继承,如果基类的构造函数是私有的(子类不可以继承基类的私有成员),或者子类是通过虚基类的方式继承,那么派生类中不能声明继承构造函数。
2.继承构造函数是隐式被编译器实现的,这样,如果继承构造函数未被调用,实际上编译器是不会生成对应的代码的,这节省了目标代码空间。
3.继承构造函数只能初始化基类变量,不能初始化子类变量。该怎么理解呢?其实这里的基类变量,实际上是被子类继承的变量了,子类生成的构造函数来操作它一点问题都没有,我只需要按照基类的构造函数定义的行为初始化就可以了,但是基类的构造函数没有定义子类变量的初始化行为(实际上也是不可能知道的,因为子类相当于是基类的扩展,扩展意味着未知),所以子类生成的构造函数不能初始化子类变量。
4.继承构造函数不会继承参数的默认值。需要特别注意。

解释1:
关于继承冲突的问题,见例如下:

struct A { A(int) {} };
struct B { B(int) {} };
struct C: A, B {
using A::A;
using B::B;
};

A 和B 的构造函数会导致C 中重复定义相同类型的继承构造函数。
解决方法是让继承类进行显示定义构造函数。

struct A
{
    A(int){}
};

struct B
{
    B(int){}
};

struct C:A,B
{
    using A::A;
    using B::B;
    C(int i):A(i),B(i) {}
};

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,完全限定的构造函数调用指的是使用类的作用域解析运算符(::)来调用构造函数。在语法上,这种调用方式是合法的,但实际上在某些情况下可能会引起编译错误或不可预测的行为。 首先,完全限定的构造函数调用可能会导致隐藏的问题。当一个类派生自另一个类,且它们都有相同的构造函数时,使用完全限定的构造函数调用可能会导致调用错误的构造函数。这是因为在派生类作用域内,会隐藏基类的构造函数,从而导致编译错误或不正确的行为。 其次,完全限定的构造函数调用可能使代码难以理解和维护。如果在代码中频繁使用完全限定的构造函数调用,那么会使代码变得冗长而难以阅读和理解。而且,如果类的命名空间发生变化或构造函数被重新定义,那么所有使用完全限定的构造函数调用的地方都需要进行相应的更改,这增加了代码的维护难度。 因此,为了提高代码的可读性和可维护性,一般不建议使用完全限定的构造函数调用。相反,可以使用默认构造函数或通过创建类的实例来调用构造函数,这样可以更直观地表示出对象的创建和初始化过程。此外,如果需要在派生类中调用基类的构造函数,可以使用初始化列表或基类构造函数的委托来实现。这样可以更清晰地表达出类之间的继承关系和构造函数的调用顺序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值