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)
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.