对于一个单一的类来说,析构函数是不是虚函数,其没有实质性的意义。但是当当前类作为基类的时候,基类的析构函数是不是虚函数则会对程序带来不同程度的影响。
看下下面的代码运行结果:
#include
using namespace std;
class Base
{
public:
Base()
{
cout << "Base:Constructor" <<endl;
}
~Base()...
分类:
编程语言 时间:
2014-12-21 22:10:13
阅读次数:
311
看过C++对象模型的话就可以知道,在构造基类时,完整的vtable没有建立起来(表项没有被相应的子类函数替换),因而无法调用到子类的函数(即构造函数中的virtual函数是本类里的方法,不是virtual的)。书中也说即使调用了,因为构造函数的调用顺序,父类在构造时子类的成员还没有初始化可能,此时调...
分类:
编程语言 时间:
2014-12-21 19:19:14
阅读次数:
217
主要讲了,1. virtual析构函数的作用与调用顺序2. 使用时机,并不是使用了继承就要把基类的析构函数变为虚函数(virtual),只有当用于多态目的时才进行一个virtual析构函数的定义。3. 不要继承那些没有将析构函数定义为virtual的类来实现多态行为对于1:有些类继承可能只是一个组合...
分类:
编程语言 时间:
2014-12-21 17:57:41
阅读次数:
156
一、现实中的事物抽象为类二、定义类中的字段和方法三、构造方法四、默认构造方法五、对象的创建六、对象的使用七、析构方法八、方法的重载九、使用this
分类:
其他好文 时间:
2014-12-21 16:33:10
阅读次数:
101
问题:
类需要一个无参的构造函数么?
类需要一个析构函数么?
类的构造函数需要初始化所有的对象成员么?
类需要一个虚析构函数么?
有些类需要虚析构函数只是为了声明他们的析构函数是虚的。绝不会用作基类的类是不需要虚析构函数的:任何虚函数只在继承的情况下才有用。假设B为父类,D为子类,B何时需要一个虚析构函数?只有有人肯呢过会对实际指...
分类:
编程语言 时间:
2014-12-19 20:45:34
阅读次数:
196
接下来的是more effective c++ 11至20条款:11.禁止异常信息(exceptions)传递到析构函数外。析构函数的调用情况可能有两种:(1)对象正常销毁 (2)异常传播过程中的栈展开机制-销毁。如果在析构函数内抛出异常,它不会被析构函数捕获,它会传播到析构函数的调用端,如果调用端...
分类:
编程语言 时间:
2014-12-18 21:59:30
阅读次数:
219
在类的实例超出范围时我们希望确保它所占的存储能被收回C#中提供了析构函数用于专门释放被占用的系统资源析构函数的名字与类名相同只是在前面加了一个符号~ 析构函数不接受任何参数也不返回任何值如果你试图声明其它任何一个以符号~ 开头而不与类名相同的方法和试图让析构函数返回一个值一样编译器都会产生一个错误析...
分类:
其他好文 时间:
2014-12-15 11:44:37
阅读次数:
137
高效C++ --经验条款(三)
给多态基类声明virtual析构函数:
“给base classes一个virtual析构函数”,这个规则只适用于带有多态性质的base classes身上。这种base classes的设计目的是为了用来“通过base class接口处理derived class对象”。
并非所有base classes的设计目的都是为了多态用途。例如标准stirng和ST...
分类:
编程语言 时间:
2014-12-14 22:47:10
阅读次数:
218
转自:http://blog.csdn.net/starlee/article/details/619827 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类:class ClxBase{public: ...
分类:
编程语言 时间:
2014-12-14 22:27:56
阅读次数:
191
STL定义有五个全局函数,作用于未初始化空间上,这样的功能对于容器的实现很有帮助。前两个函数是用于构造的construct()和用于析构的destroy(),另三个函数是uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n,分别...
分类:
其他好文 时间:
2014-12-13 21:42:01
阅读次数:
226