矜(bai)持(gei)的云拏 2023-10-19 17:10 采纳率: 81.3%
浏览 4
已结题

C++类继承,关于构造函数的问题。

问题:为什么父类必须要有无参构造函数才能通过编译?
代码如下


#include<iostream>
using namespace std;
class A
{
    public:
    int x;
    A(){}//去掉这句就不可通过编译
    A(int i):x(i){}
};
class B:public A
{
    public:
    B(int j)
    {x= j;}
};
int main()
{
    return 0;
}

或者需要如下代码,才能通过


#include<iostream>
using namespace std;
class B
{
    public:
    int x;
    B(int i):x(i){}//“:”后对应的是基类的构造函数以及对象成员对应的参数初始化
};
class A:public B
{    int a;
    public:
      A(int j):a(j*10),B(2)
      {cout<<"B::x="<<x<<"A::a="<<a<<endl;}
};
int main()
{
    A d(1);
}

我的疑惑是,对于代码一,去掉A的构造函数为何就不可编译过?
对于代码二,为何去掉B(2),并对x赋值后,却不能编译过?B(2)不也是对x赋值吗?

  • 写回答

1条回答 默认 最新

  • 关注

    对于代码一,去掉A的构造函数为何就不可编译过?

    当你自己写一个构造函数, 默认构造函数就不会自动生成了。但B构造又调用A的默认构造。

    对于代码二,为何去掉B(2),并对x赋值后,却不能编译过?B(2)不也是对x赋值吗?

    B(2)不叫对x赋值,它叫调用构造函数。如果你在大括号中给x赋值,又回到上一个问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月19日
  • 已采纳回答 10月19日
  • 修改了问题 10月19日
  • 创建了问题 10月19日