在阿里巴巴上做网站要多少钱,wordpress 设定首页,泰安专业网页设计培训,神箭手wordpress免费吗C#xff1a;构造函数和析构函数能否为虚函数#xff1f; 简单回答是#xff1a;构造函数不能为虚函数#xff0c;而析构函数可以且常常是虚函数。 #xff08;1#xff09; 构造函数不能为虚函数 让我们来看看大牛C之父 Bjarne Stroustrup 在《The C Programming Langua… C构造函数和析构函数能否为虚函数 简单回答是构造函数不能为虚函数而析构函数可以且常常是虚函数。 1 构造函数不能为虚函数 让我们来看看大牛C之父 Bjarne Stroustrup 在《The C Programming Language》里是怎么说的 To construct an object, a constructor needs the exact type of the object it is to create. Consequently, a constructor cannot be virtual. Furthermore, a constructor is not quite an ordinary function, In particular, it interacts with memory management in ways ordinary member functions dont. Consequently, you cannot have a ponter to a constructor. --- From 《The C Progamming Language》15.6.2 然而大牛就是大牛这段话对一般人来说太难理解了。那下面就试着解释一下为什么 这就要涉及到C对象的构造问题了C对象在三个地方构建1函数堆栈2自由存储区或称之为堆3静态存储区。无论在那里构建其过程都是两步首先分配一块内存其次调用构造函数。好问题来了如果构造函数是虚函数那么就需要通过vtable 来调用但此时面对一块 raw memeory到哪里去找 vtable 呢毕竟vtable 是在构造函数中才初始化的啊而不是在其之前。因此构造函数不能为虚函数。 2析构函数可以是虚函数且常常如此 这个就好理解了因为此时 vtable 已经初始化了况且我们通常通过基类的指针来销毁对象如果析构函数不为虚的话就不能正确识别对象类型从而不能正确销毁对象。 困惑我们的是我们却经常看到“虚构造函数”这样的说法这就要归咎于不负责任或者说误人子弟的媒体了包括书、技术文章等等。因为他们说的是类似下面这样的做法 class Expr { public: Expr(); Expr(const Expr); virtual Expr* new_expr() { return new Expr(); } virtual Expr* clone() { return new Expr(*this); } }; ---转自Linux Tour