zoukankan      html  css  js  c++  java
  • NO.6: 为多态基类声明virtual析构函数

    注意:polymorphic base class 应该具有虚析构函数,如果class带有任何virtual函数,也应具有虚析构函数

            class不具备polymorphic属性则不应该声明virtual 析构函数

    1.老生常谈,如果一个类需要被使用为base calss 则为它声明 "virtual析构函数",确保删除一个"指向派生类对象的基类指针" 时内存完整删除

    2.对于不需要使用为base class的类,反而不声明virtual 函数是最好的,如果你的类只具有一些内置类型数据类(不带C++其他特性的类),这样的类可以很好的移植到C等一些其他语言上,反而加上virtual函数的类,会生成一个由vptr指向的虚函数表,vptr指向一个由函数指针数组的表(vtbl),每个类都具有自己的vtabl,先不管虚表机制,但这些虚表指针会占一部分内存,最坏50%-100%之间(字节补齐原因)

    所以不适用为base class的类,最好不声明virtual函数

    3.如果一个类你想声明为abstract的类,然而手上没有可声明为virtual的函数,你可声明析构为pure virtual的,但注意必须携带函数体,因为derived class 生成的析构函数会默认调用~base(),如果你没有写函数体,会造成链接器错误;

     1 #include <iostream>
     2 
     3 class Base
     4 {
     5 public:
     6     virtual ~Base()=0;
     7 };
     8 
     9 Base::~Base()
    10 {
    11     //可以delete 动态内存
    12     std::cout<<"Something"<<std::endl;
    13 }
    14 
    15 
    16 class Derived: public  Base
    17 {
    18 public:
    19 
    20 };
    21 
    22 
    23 
    24 
    25 int main(int argc, char **argv)
    26 {
    27     Derived A;
    28     return 0;
    29 }
  • 相关阅读:
    .net系统缓存
    Android开源项目第四篇——开发及测试工具篇
    Android开源项目第三篇——优秀项目篇
    Android开源项目第二篇——工具库篇
    Android开源项目第一篇——个性化控件(View)篇
    android
    android 屏幕适配
    EditText属性
    Style与Theme
    ListView设背景
  • 原文地址:https://www.cnblogs.com/xuaidongstdudyrecording/p/7259419.html
Copyright © 2011-2022 走看看