一个有关C++中对象构造、析构和虚函数的问题
2012-10-15 17:10
330 查看
问题:执行如下C++代码,程序的输出是什么?
分析:主函数的第一句创建了一个Derived类对象,按照C++的对象构造顺序,在构造派生类对象时,先调用基类的构造函数,再调用派生类的构造函数。基类构造函数调用了基类的foo()函数,派生类的构造函数调用了派生类的foo()函数。由于Base()类的析构函数没有定义为虚函数,主函数的第二句只调用Base类的析构函数,这样就发生了内存泄露。
以上代码的执行结果为:
如果将以上代码主函数的第一行改为Derived *p = new Derived;或者将Base类的析构函数加上virtual关键字,则代码的执行结果为:
#include <iostream> using namespace std; class Base{ public: Base(){ cout << "Base Constructor" << endl; foo(); } ~Base(){ cout << "Base Destructor" << endl; foo(); } virtual void foo(){ cout << "Base Function" << endl; } }; class Derived: public Base{ public: Derived(){ cout << "Derived Constructor" << endl; foo(); } ~Derived(){ cout << "Derived Destructor" << endl; foo(); } void foo(){ cout << "Derived Function" << endl; } }; int main() { Base *p = new Derived; delete p; return 0; }
分析:主函数的第一句创建了一个Derived类对象,按照C++的对象构造顺序,在构造派生类对象时,先调用基类的构造函数,再调用派生类的构造函数。基类构造函数调用了基类的foo()函数,派生类的构造函数调用了派生类的foo()函数。由于Base()类的析构函数没有定义为虚函数,主函数的第二句只调用Base类的析构函数,这样就发生了内存泄露。
以上代码的执行结果为:
如果将以上代码主函数的第一行改为Derived *p = new Derived;或者将Base类的析构函数加上virtual关键字,则代码的执行结果为:
相关文章推荐
- 深入理解C++面向对象机制(三)构造与析构
- 关于对象的构造、复制构造、析构、赋值的问题
- C++构造与析构(18) - 静态对象(static object)何时销毁
- C++构造,析构,友元类,对象,static成员,复制构造函数,运算符重载杂谈
- C++不能中断构造函数来拒绝产生对象(在构造和析构中抛出异常)
- C++ 对象构造与析构以及内存布局
- C++ 容器中存入”指针“及对象析构问题
- [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(中)
- 深入C++之对象构造析构
- C++对象的构造、赋值和析构
- C++对象模型 第五章 构造、析构、拷贝语意学
- C++ - 对象模型之各种对象的内存分配、构造和析构
- 有关C++中常量字符串的一个小问题
- C++中的对象作为局部变量时的析构问题
- C++ STL 如何安全的将一个含有指针变量的类对象放在容器中? 避免浅拷贝问题
- 深入探索C++对象模型之五 --- 析构、构造、拷贝语意学
- 【C++学习历程3】对象的构造和析构
- C++中用函数返回值初始类对象时的一个问题
- C++中用函数返回值初始类对象时的一个问题
- 有关C++参数传值的一个问题探讨