精华内容
下载资源
问答
  • c++纯虚析构函数

    千次阅读 2018-03-24 10:39:28
    原因是这样的,当我们在类里面实在找不到可以定义为纯虚函数的成员方法的时候,这时候可以将析构函数定义为纯析构函数;纯虚构函数的实现需要注意以下几个地方: 通常的纯虚函数不需要函数体,是因为我们一般不会...

    纯虚析构函数和虚析构函数的区别在于

    纯虚析构函数一般用于将类定义为抽象类,这时候有同学会问啦?抽象类不是定义一般成员方法的吗?原因是这样的,当我们在类里面实在找不到可以定义为纯虚函数的成员方法的时候,这时候可以将析构函数定义为纯析构函数;

    纯虚构函数的实现需要注意以下几个地方:

        通常的纯虚函数不需要函数体,是因为我们一般不会调用抽象类的这个函数,只会调用派生类的对应函数,但是父类纯虚构函数需要要函数体,因为我们知道,当子类继承父类的时候,假如父类存在纯虚函数,子类需要实现该函数,否则就会报错。

        纯虚析构函数也一样,也需要实现,可是呢?能不能像通常的纯虚函数一样,在子类重写即可,可是,有见过析构函数重写的吗,这时候的做法是给纯虚析构函数指定函数体

    #include <iostream>
    using namespace std;
    class Father{
    public:
        virtual ~Father() = 0;
    };
    class Son : public Father{
      public:
        ~Son(){}
    };
    int main(int argc, char *argv[])
    {
        cout << "Hello World!" << endl;
        Father *father = new Son;
        delete father;
        return 0;
    }

       上述代码报错:     error: undefined reference to

    Father::~Father()

    这就是我们说到的,纯虚析构函数需要指定函数体了

    修改后

    #include <iostream>
    using namespace std;
    class Father{
    public:
        virtual ~Father() = 0;
    };
    Father::~Father()
    {
        cout<<"I am father"<<endl;
    }
    class Son : public Father{
      public:
        ~Son(){cout<<"I am Son"<<endl;}
    };
    int main(int argc, char *argv[])
    {
        cout << "Hello World!" << endl;
        Father *father = new Son;
        delete father;
        return 0;
    }



    展开全文
  • 那么问题又来了,析构函数可以虚函数吗? 答:可以 把基类析构函数定义为虚函数,在调用析构函数时,会根据指向的对象类型到它的虚函数表中找到对应的虚函数,此时找到的是派生类的析构函数,因此调用该析构函数;...

    首先,构造函数是不能为虚函数的
    在这里插入图片描述

    调用构造函数后, 才能生成一个对象。 假设构造函数是虚函数, 虚函数存在于虚函数表中, 而去找虚函数表又需要虚函数表指针, 而虚函数表指针又存在于对象中, 这样就矛盾了: 都没有生成对象, 哪有什么虚函数表指针呢?
    在这里插入图片描述
    那么问题又来了,析构函数可以是虚函数吗?
    答:可以
    把基类析构函数定义为虚函数,在调用析构函数时,会根据指向的对象类型到它的虚函数表中找到对应的虚函数,此时找到的是派生类的析构函数,因此调用该析构函数;而调用派生类析构函数之后会再调用基类的析构函数,因此不会导致内存泄漏。

    展开全文
  • 我们在类中定义的函数都是内联函数,析构函数经常在类中定义,而析构函数又经常声明为虚函数,以前没有发现什么问题。 其实虚函数可以为内联函数,这与内联函数的定义没什么冲突。  内联函数到底要不...

      虚函数是通过指针或引用调用函数时,通过虚函数表来确定调用的函数,在运行时确定。

      内联函数是在编译时,将调用函数处插入内联函数的代码,省去了函数调用时的开销。

      表面上看,虚函数不能为内联函数。我们在类中定义的函数都是内联函数,析构函数经常在类中定义,而析构函数又经常声明为虚函数,以前没有发现什么问题。

    其实虚函数可以为内联函数,这与内联函数的定义没什么冲突。

      内联函数到底要不要在调用处展开取决于怎么调用内联函数。

      class A
      {

        A(){}

        ~A(){}

        virtual void foo()

        {

          cout << "A::foo" << endl;

        }

      }

      class B

      {

        virtual void foo()

        {

          cout << "B::foo" << endl;

        }

      }

      A *a = new B();

      int main()

      {

        a->foo();//不是内敛

        a->A::foo();//内联

      }

      无论显式还是隐式,inline都只是一个申请,最终由编译器决定内联还是不内联

        inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

      另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。

    转载于:https://www.cnblogs.com/vinke2013/p/7246894.html

    展开全文
  • C++ 虚函数

    2015-09-01 17:07:00
    3、析构函数可以定义虚函数吗? 可以,虚析构函数是允许的,但是要注意,只有在作为基类时,我们才需要将析构函数写成虚函数。 4、虚拟机制与构造函数 在类的构造函数中,虚拟机制不会发生作用。因为,基类的构造...

    1、什么是虚函数?

    在类中使用virtual关键字声明的函数就叫虚函数。

    2、为什么使用虚函数?

    因为使用虚函数以后,集成类可以重载基类中的成员函数。

    3、析构函数可以定义成虚函数吗?

    可以,虚析构函数是允许的,但是要注意,只有在作为基类时,我们才需要将析构函数写成虚函数。

    4、虚拟机制与构造函数

    在类的构造函数中,虚拟机制不会发生作用。因为,基类的构造函数在派生类构造函数之前执行,当基类构造函数运行时,派生类数据成员还没有被初始化。

    引用和指针对象 实现多态。。。

     

    5、类继承最重要的特性是可用基类的指针或引用来操作派生类

    转载于:https://www.cnblogs.com/audi-car/p/4776214.html

    展开全文
  • c++的虚函数

    2020-03-19 22:02:41
    文章目录c++的虚函数虚函数的作用?虚函数的使用方法?虚函数和纯虚函数的...虚函数是定义在基类中的函数,用virtual声明成员函数为虚函数。子类可以选择性地对其进行覆盖。 静态函数不能是虚函数 (因为它没有t...
  • C++ 基础知识(二)——多态与虚函数题目C 基础知识二多态与虚函数 题目 C对象模型 程序模型 抽象数据类型模型abstruct data type modelADT ...问题那么构造函数可以定义为虚函数吗 参考资料C++对象模型在
  • C++高频知识总结P4

    2020-09-03 15:34:49
    析构函数可以虚函数吗?为什么析构函数要定义为虚函数?2.构造函数或者析构函数中调用虚函数会怎样?3.声明和定义的区别?4.指针函数和函数指针?5.指针常量?常量指针?6.深拷贝与浅拷贝7.什么时候需要自定义拷贝...
  • C++学习笔记07

    2017-09-05 20:50:00
    1:子类析构时要调用父类的析构函数吗析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部...2:基于构造函数的特点,不能将构造函数定义为虚函数,但可以
  • 6、析构函数为什么要是virtual?7、virtual函数可以是static吗?8、构造、析构函数包含函数可以有virtual函数?二、多态性1、C++的多态性2、静态绑定和动态绑定3、模板类?4、模板类中可以使用虚函数吗析构函数、...
  • 转载注明出处:... 新浪微博@小山best 构造函数可以虚函数吗? ...构造函数、析构函数、虚函数可否内联,有何意义?...为什么一般要定义析构函数为虚析构函数? 静态链接和动态链接? gcc/g++...
  • C++面试题. 小米社招

    千次阅读 2020-06-03 11:34:34
    C++析构函数可以虚函数吗?为什么要将析构函数设置为虚函数? C++如何实现多态?虚表指针是什么时候被初始化的?实例化一个对象需要那几个阶段?(三个) C++偏特化? 重载、重写、覆盖? static关键字的作用...
  • 父类的析构函数为什么要定义为虚函数? 内联函数,构造函数,静态成员函数可以虚函数吗? 构造函数中可以调用虚函数吗? 为什么需要虚继承?虚继承实现原理解析, C ++内存分配机制 指针 迭代器与普通指针有什么...
  • 18多态

    2017-06-01 14:10:52
    多态多态 问题引出 解决方案 工程意义 成立条件 理论基础 本质剖析 1 多态实现原理 ...6 类的每个成员函数是否都可以声明为虚函数为什么 7 构造函数中调用虚函数能实现多态吗为什么 8 虚函数表指针VPTR被编译
  • C#面经_全职

    2021-06-11 23:17:00
    8、析构函数可以定义为虚函数吗? 9、构造函数的作用? 10、用过或了解的设计模式? 11、web如何获取客户端的数据? 12、程序崩溃或异常怎么处理? 13、内存中不是非托管内存崩溃了,调用第三方库导致内存崩溃
  • 零起点学通C++多媒体范例教学代码

    热门讨论 2010-11-30 09:35:13
    10.4.析构函数和delete运算符 10.4..1 默认析构函数 10.4.2 调用构造函数进行类型转换 10.5 浅层复制构造函数 10.6 深层复制构造函数 第11章 运算符重载 11.1 运算符重载 11.2 在成员函数中实现自加 11.3 重载前置...
  • 10.4.析构函数和delete运算符 10.4..1 默认析构函数 10.4.2 调用构造函数进行类型转换 10.5 浅层复制构造函数 10.6 深层复制构造函数 第11章 运算符重载 11.1 运算符重载 11.2 在成员函数中实现自加 11.3 ...
  • 10.4 析构函数和delete运算符 156 10.4.1 默认析构函数 156 10.4.2 调用构造函数进行类型转换 157 10.5 浅层复制构造函数 158 10.6 深层复制构造函数 160 第11章 运算符重载 162 11.1 运算符重载 162 11.2 在...
  • 摩托罗拉C++面试题

    2009-08-19 19:52:41
    析构函数可以为纯虚函数。 10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。 深拷贝意味着拷贝了资源和指针,而浅拷贝只是拷贝了指针,没有拷贝资源 这样使得两个指针指向同一份资源,造成对同一份析构两次...
  • 10.3.4 析构函数 10.3.5 改进Stock类 10.3.6 构造函数和析构函数小结 10.4 this指针 10.5 对象数组 10.6 类作用域 10.6.1 作用域类的常量 10.6.2 作用域内枚举(C++11) 10.7 抽象数据类型 10.8 总结 ...
  • “,然后再再深入一点,“如果把析构函数标记为虚函数呢?”,要准确得出这些答案就得考查我们深厚的内力了。其实,我还是蛮喜欢这样写书风格的,层层深入,很能考查读者对某个知识点的掌握程度,然后再跟着作者再往...
  • 面试题107 构造函数与析构函数的调用时机 10.2 访问控制 面试题108 有哪几种继承方式 面试题109 继承时访问级别如何变化 10.3 继承时的类作用域 面试题110 什么时候发生函数覆盖 面试题111 如何访问基类的成员 10.4 ...
  • 21天学通C++ (中文第五版)

    热门讨论 2010-06-23 16:57:03
    12.5.4 创建虚析构函数 12.5.5 复制构造函数 12.5.6 使用方法的代价 12.6 小结 12.7 问与答 12.8 作业 12.8.1 测验 12.8.2 练习 第13章 管理数组和字符串 13.1 什么是数组 13.1.1 访问数组元素 ...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题107 构造函数与析构函数的调用时机 116 10.2 访问控制 118 面试题108 有哪几种继承方式 118 面试题109 继承时访问级别如何变化 120 10.3 继承时的类作用域 121 面试题110 什么时候发生函数覆盖 121 面试题111 ...
  • 面试题10:编写类String 的构造函数、析构函数和赋值函数 8.4 拷贝构造函数 面试题11:谈谈对拷贝构造函数和赋值运算符的认识 面试题12:写出当定义#define _INMAIN 0和不定义时代码打印结果 第9章 继承与多态 9.1 ...
  • const定义的常量是有类型的,所以在使用它们时编译器可以查错;而且,这些变量在调试时仍然是可见的。 2-5 请写出C++语句声明一个常量PI,值3.1416;再声明一个浮点型变量a,把PI的值赋给a。 解: const float PI...
  • 14.4.7 析构函数里的异常 332 14.5 不是错误的异常 333 14.6 异常的描述 334 14.6.1 对异常描述的检查 335 14.6.2 未预期的异常 336 14.6.3 异常的映射 336 14.7 未捕捉的异常 338 14.8 异常和效率 339 14.9...
  • 14.4.7 析构函数里的异常 332 14.5 不是错误的异常 333 14.6 异常的描述 334 14.6.1 对异常描述的检查 335 14.6.2 未预期的异常 336 14.6.3 异常的映射 336 14.7 未捕捉的异常 338 14.8 异常和效率 339 14.9...
  • C++程序设计语言(特别版)--源代码

    热门讨论 2012-04-23 07:33:51
    14.4.7 析构函数里的异常 332 14.5 不是错误的异常 333 14.6 异常的描述 334 14.6.1 对异常描述的检查 335 14.6.2 未预期的异常 336 14.6.3 异常的映射 336 14.7 未捕捉的异常 338 14.8 异常和效率 339 14.9...
  • c++ 面试题 总结

    2009-09-16 08:44:40
    define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的 a /= (k+m)*(k+m)/(k+m)*(k+m); =>a /= (k+m)*1*(k+m); =>a = a/9; =>a = 1; ---------------------------------------------------------...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

析构函数可以定义为虚函数吗