怎么自助建站,网站建设捌金手指下拉二六,建设网站的目的服装类,wordpress 常见问题作为通常的原则#xff0c;如果一个类定义了虚函数#xff0c;那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着#xff1a;这个类会被继承#xff0c;并且会通过基类的指针指向子类对象#xff0c;从而得到多态性。 这个类可能会被继承#xff0c;并且会…作为通常的原则如果一个类定义了虚函数那么它的析构函数就应当是virtual的。因为定义了虚函数则隐含着这个类会被继承并且会通过基类的指针指向子类对象从而得到多态性。 这个类可能会被继承并且会通过基类的指针指向子类对象”因此基类的析构函数是否为虚将决定子类的对象是否被析构
示例代码 #include iostream.h struct A { virtual ~A() {cout~A()\n;} }; struct B: public A { ~B() {cout~B()\n;} }; void main() { A* p new B; delete p; } 如果 A的析构函数不是virtual的那么此时就不是先调用B的析构函数再调用A的析构函数。 Output: ~A(); 如果A 的析构函数为virtual则先~B()再~A() Output: ~B(); ~A(); 类如果会被派生的话析构函数一般都应该定义为virtual的主要不是防止内存泄露而是为了正确的析构。如果是个封闭类即不再被派生就不要定义为virtual的。虚函数毕竟耗费较大的。
不用virtual 的几种情况 1、作为非公有基类。仅作为 private base class 使用的 class 不需要使用虚拟析构函数 2、不作为接口使用的基类。 3. 如果你可以保证这个类不被public继承private/protected继承的话在非friend函数/类中就无法用基类指针指向派生类了 4. 如果它的所有派生类包括派生类的派生类的析构函数都是trivial的这里的trivial指的是在程序员的层次什么事也不做 5. 如果不需要用基类的指针指向派生类的对象 在这五种情况下不把析构函数声明为virtual都是可以的何况效率会高一些——但前提是你得保证前提的成立——不过这些保证常常是很难100的谁能保证别人在派生你的类的时候析构函数是trivial的或者别人不用你提供的基类的指针指向派生类对象这些常常是很难得到保证的。
声明基类的析构函数为virtual并非总是为了防止memory leak 另外这也只是作为一般的原则基类中有虚函数则把其析构函数声明为virtual。如果你的析构函数什么事也不作从效果上来说不声明为virtual也无妨 为什么C析构函数前面有时需要 virtual#include iostream using namespace std;class Base{public:virtual ~Base() {cout~Bendl;}
};class Derived:public Base{public:virtual ~Derived() {cout~Dendl;}
};int main (){Base *bnew Derived;delete b;
} 复制代码 以上代码执行结果是
~D
~B 对于析构函数使用虚函数的解释是这样的因为是使用语句 Base *bnew Derived;来创建的对象b如果我们不把析构函数声明为虚函数那么实际上在对象生命周期结束时调用的将只是基类Base的析构函数而派生类Derived的析构函数将是不调用的你可以试验一下此时只打印B。而我们为了正确地释放对象所以要将析构函数声明为虚函数这时基类和派生类的析构函数就都会调用了。