使用子类创建对象,并给父类指针赋值时,当调用delete语句时,只会调用父类的析构函数。这样,如果在子类的析构函数中有数据操作,就可能发生内存泄漏。
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base Constructor\n";
}
~Base() {
std::cout << "Base Destructor\n";
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived Constructor\n";
}
~Derived() {
std::cout << "Derived Destructor\n";
}
};
int main() {
Base* base1 = new Derived();
delete base1;
std::cin.get();
}
输出为:
Base Constructor
Derived Constructor
Base Destructor
可以通过在父类中的析构函数添加virtual关键字,来解决
#include <iostream>
class Base {
public:
Base() {
std::cout << "Base Constructor\n";
}
virtual ~Base() {
std::cout << "Base Destructor\n";
}
};
class Derived : public Base {
public:
Derived() {
std::cout << "Derived Constructor\n";
}
~Derived() {
std::cout << "Derived Destructor\n";
}
};
int main() {
Base* base = new Base();
delete base;
std::cout << "-------------------------\n";
Derived* derived = new Derived();
delete derived;
std::cout << "-------------------------\n";
Base* base1 = new Derived();
delete base1;
std::cin.get();
}
输出为:
Base Constructor
Derived Constructor
Derived Destructor
Base Destructor
另外注意子类定义时的public关键字,如果不加,则不能通过子类对象给父类赋值