c ++继承和构造函数

Jer*_*ees 3 c++ inheritance constructor

class A {
public:
      A(int i): data(i) {cout << "A::A(" << i << ")" << endl;}
      A(const char* s): data(0) { cout << "A::A(" << s << ")"<< endl;}
      ~A() { cout << "A::~A()" << endl;}
private:
int data;
};

class B:public A {
public:
    B(const A& a): A(a){ std::cout << "B::B(const A& a)" << std::endl;}
     ~B() { std::cout << "B::~B()" << std::endl;}
};

int main() {
    B b0(0);
    B b1("abc");
return 0;
}
Run Code Online (Sandbox Code Playgroud)

非常简单,有人可以解释为什么输出是:

 A::A(0)
 B::B(const A& a)
 A::~A()
 A::A(abc)
 B::B(const A& a)
 A::~A()
 B::~B()
 A::~A()
 B::~B()
 A::~A()
Run Code Online (Sandbox Code Playgroud)

Kir*_*rov 5

B b0(0);- B没有这样的构造函数,所以编译器正在寻找一些构造函数,只需要一个强制转换就可以调用(一个隐式强制转换是允许的,2个不是),所以它找到了B::B(const A& a),因为它A有一个只有一个参数的构造函数,这是A::A(int i).这意味着,0可以被转换为int,因此A创建临时对象(并在创建B之后销毁).所以,这就是为什么我们有


 A::A(0)
 B::B(const A& a)
 A::~A()
Run Code Online (Sandbox Code Playgroud)

接下来叫做:B b1("abc");,所以这里来了:


 A::A(abc)
 B::B(const A& a)
 A::~A()
Run Code Online (Sandbox Code Playgroud)

这绝对是一样的int,但在这里char*.

然后,两个对象都被破坏,因此它们的析构函数以相反的顺序被调用,因为它们的构造函数被调用,那就是


 B::~B()
 A::~A()
 B::~B()
 A::~A()
Run Code Online (Sandbox Code Playgroud)

来自.

它看起来很有问题,因为你没有超载A::A( const A& a)而且你没有看到,它也被称为2次.

干杯(:


一个小编辑:不A::A(),但是A::A( const A& a)- 感谢Nim.