【发布时间】:2018-12-17 11:49:09
【问题描述】:
给出以下代码:
#include <iostream>
using namespace std;
class A {
public:
A() {
}
A(const A& a) {
cout << "A copy ctor" << endl;
}
virtual ~A() {
cout << "A dtor" << endl;
}
virtual void type() const {
cout << "This is A" << endl;
}
};
class B: public A {
public:
virtual ~B() {
cout << "B dtor" << endl;
}
virtual void type() const {
cout << "This is B" << endl;
}
};
A f(A a) {
a.type();
return a;
}
const A& g(const A& a) {
a.type();
return a;
}
int main() {
A *pa = new B();
cout << "applying function f:" << endl;
f(*pa).type();
cout << "~~~ delete: ~~~" << endl;
delete pa;
return 0;
}
我得到以下输出:
应用函数 f:
复制 ctor
这是A
复制 ctor
这是 A
A dtor
A dtor
~~~ 删除:~~~
B dtor
导演
但我有些不明白。可以看出,虽然我们从f 存在,但那里的对象并没有被破坏。为什么没有被破坏? (毕竟我们超出了函数的作用域,所以它必须被销毁,不是吗?)
注意:我强调了有问题的行(我不明白为什么会以这种顺序发生)
我们转到函数 f,此时,我们调用 copy c'tor 并打印 "A copy ctor" (Ok) ,然后返回函数 f 并转到 type() ,然后然后,它打印 "This is A" ,现在我们从函数 f 中转义,所以我们调用了 copy c'tor ,因此将打印 "A copy ctor" ,但是,现在,没有调用析构函数(而我们逃离函数 f)..?
我认为输出将如下(根据上面的描述):
应用函数 f:
复制 ctor
这是 A
复制 ctor(逃离type)
A dtor(逃离type)
这是A(主要)
~~~ 删除:~~~
B dtor
A dtor
【问题讨论】:
-
你认为 A dtor A dtor 在你的输出中是什么意思?
-
@NathanOliver 我认为当我们从
function f逃脱时,我们调用了复制c'tor,然后它破坏了对象(在从函数f逃脱时)在它转到type()之后,因此我无法理解输出的顺序。 -
@Software_t 你是说你期望 A copy ctor This is A A copy ctor A dtor 这是 A A dtor
-
也许如果您分享了您期望的输出,这将有助于澄清您到底在问什么。
-
@Software_t 请发布您期望的输出。您的解释提出的问题多于回答的问题。
标签: c++ c++11 inheritance language-lawyer virtual