继承:没有合适的默认构造函数可用

tal*_*099 2 c++ inheritance constructor

我收到错误:没有适合 B 的默认构造函数。但是,当我给出参数 ii 并且不想调用默认构造函数时,我不明白为什么编译器要调用默认构造函数。

#include <iostream>
using namespace std;

class A {
    int i;
public:
    A(int ii) { i = ii; cout << "Constructor for A\n"; }
    ~A() { cout << "Destructor for A\n"; }
    void f() const{}
};

class B {
    int i;
public:
    B(int ii) { i = ii; cout << "Constructor for B\n"; }
    ~B() { cout << "Destructor for B\n"; }
    void f() const{}
};

class C:public B {
    A a;
public:
    C() { cout << "Constructor for C\n"; }
    ~C() { cout << "Destructor for C\n"; }
    void f() const {
        a.f();
        B::f();
    }
};

class D:public B {
    C c;
public:
    D(int ii) { B(ii); cout << "Constructor for D\n"; }
    ~D() { cout << "Destructor for D\n"; }
};

int main() {
    D d(47);
}
Run Code Online (Sandbox Code Playgroud)

mfo*_*ini 5

您的父构造函数应该在初始化列表中调用:

class D:public B {
    C c;
public:
    D(int ii) : B(ii)/* <- */ { cout << "Constructor for D\n"; }
    ~D() { cout << "Destructor for D\n"; }
};
Run Code Online (Sandbox Code Playgroud)

请注意 /* <- */ 注释。这需要改变。

您现在正在做的是在 D 类构造函数中创建 B() 的实例,该实例未被使用:

D(int ii) { B(ii); /* <- useless*/ }
Run Code Online (Sandbox Code Playgroud)