#include <iostream>
#include <string.h>
#include<stdio.h>
using namespace std;
class Father {
public:
Father(const char* addr ="中国"){
cout << "执行了Father的构造函数" << endl;
long len = strlen(addr) + 1;
this->addr = new char[len];
strcpy(this->addr,addr);
}
// 把Father类的析构函数定义为virtual函数时,
// 如果对 Father类的指针使用delete操作时,
// 就会对该指针使用“动态析构”:
// 如果这个指针,指向的是子类对象,
// 那么会先调用该子类的析构函数,再调用自己类的析构函数
virtual ~Father(){
cout << "执行了Father的析构函数" << endl;
if (addr) {
delete addr;
addr = NULL;
}
}
private:
char* addr;
};
class Son :public Father {
public:
Son(const char *game="吃鸡", const char *addr="中国")
:Father(addr){
cout << "执行了Son的构造函数" << endl;
long len = strlen(game) + 1;
this->game = new char[len];
strcpy(this->game, game);
}
~Son(){
cout << "执行了Son的析构函数" << endl;
if (game) {
delete game;
game = NULL;
}
}
private:
char* game;
};
int main(void) {
cout << "----- case 1 -----" << endl;
Father* father = new Father();
delete father;
cout << "----- case 2 -----" << endl;
Son* son = new Son();
delete son;
cout << "----- case 3 -----" << endl;
father = new Son();
delete father;
return 0;
}
Thread 1: EXC_BAD_ACCESS (code=1, address=0x4048)报错是这个
----- case 2 -----
执行了Father的构造函数
执行了Son的构造函数
执行了Son的析构函数
执行了Father的析构函数
----- case 3 -----
执行了Father的构造函数
执行了Son的构造函数
执行了Son的析构函数
执行了Father的析构函数
第一个虚函数表指针:0x4048
调用第1个虚函数:(lldb)
这个事调试的结果