#include <iostream>
#include <cstdlib>
#include <string.h>
using namespace std;
class A {
public:
A () {cout<<" A\n";}
virtual ~A () {cout<<" ~A\n";}
};
class B : public A {
public:
B () :A() {cout<<" B\n";}
virtual ~B() {cout<<" ~B\n";}
};
int main (int, char *[]) {
A *ap = new B;
delete ap;
A b = *ap;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
A
B
~B
~A
Run Code Online (Sandbox Code Playgroud)
为什么A的最后一个析构函数被调用为A b =*ap为什么不在这里调用A的构造函数?
谢谢 !!!
您遇到了未定义的行为,任何事情都可能发生.
你打电话后delete ap;取消引用它是非法的:
delete ap;
A b = *ap;
Run Code Online (Sandbox Code Playgroud)
除此之外,你知道析构函数是以相反的继承顺序调用的,对吧?这意味着如果删除a B,~A也将调用基类析构函数.
另请注意,如果它是有效的(它不是),A b = *ap;则会调用编译器生成的复制构造函数,而不是构造函数.
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |