精华内容
下载资源
问答
  • 析构函数可以为虚函数,并且一般情况下基类析构函数要定义虚函数。 只有在基类析构函数定义虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调 用派生类的析构函数(从该级向上按序调用虚函数),...

    目录

     

    析构函数:

    构造函数:

    结论:


    析构函数:

    • 析构函数可以为虚函数,并且一般情况下基类析构函数要定义为虚函数。
    • 只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。
    • 析构函数可以是纯虚函数,含有纯虚函数的类是抽象类,此时不能被实例化。但派生类中可以根据自身需求重新改写基类中的纯虚函数。

    构造函数:

    • 构造函数不能定义为虚函数。在构造函数中可以调用虚函数,不过此时调用的是正在构造的类中的虚函数,而不是子类的虚函数,因为此时子类尚未构造好。
    • 虚函数对应一个vtable(虚函数表),类中存储一个vptr指向这个vtable。如果构造函数是虚函数,就需要通过vtable调用,可是对象没有初始化就没有vptr,无法找到vtable,所以构造函数不能是虚函数。

    结论:

    1. 析构函数可以是虚函数或者纯虚函数
    2. 构造函数不可以是虚函数或者纯虚函数
    展开全文
  • 一:构造函数不能声明为虚函数的原因 1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。 而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该...

    构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。

    一:构造函数不能声明为虚函数的原因

    1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。
    而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,
    还是该类的一个派生类,或是更深层次的派生类。无法确定。

    2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,
    让他指向正确的虚函数表。
    而在构造对象期间,虚函数表还没有被初 始化,将无法进行。

    二:析构函数可以是虚函数,也可以是纯虚函数


     在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。

     class awov {
    
      public:
    
      virtual ~awov() = 0; // 声明一个纯虚析构函数
    
      };

        这个类有一个纯虚函数,所以它是抽象的,而且它有一个虚析构函数,所以不会产生析构函数问题。但这里还有一件事:必须提供纯虚析构函数的定义:

      awov::~awov() {} // 纯虚析构函数的定义

        这个定义是必需的,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~awov的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上。

        虽然抽象类的析构函数可以是纯虚函数,但要实例化其派生类对象,仍必须提供抽象基类中析构函数的函数体。抽象类的纯虚函数的实现可以由自身给出,也可以由派生类给出。错了,除了析构函数外,其他函数都不行,必须要在派生类中进行实现

    展开全文
  • 虚函数--纯虚函数

    2019-03-29 00:08:09
    虚函数 ...任何构造函数之外的非静态函数都可以是虚函数。 纯虚函数 有些情况,我们并不希望在基类中定义一个函数(它本身可能没有意义,也不合理),而是希望它的每一个派生类自己去定义。定义纯...

    虚函数

    对于某些函数,积累希望它的派生类自己去定义适合自身的版本,这个时候就将这些函数声明为虚函数
    定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。(动态绑定)(多态:根据调用函数的对象的类型来执行不同的函数)
    任何构造函数之外的非静态函数都可以是虚函数。

    纯虚函数

    有些情况,我们并不希望在基类中定义一个函数(它本身可能没有意义,也不合理),而是希望它的每一个派生类自己去定义。定义为纯虚函数,表示这个函数没有被实现。
    在虚函数后加上“=0”就可以定义纯虚函数。
    virtual void fun()=0

    含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类,不能直接创建一个抽象基类对象。

    展开全文
  • 构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。 抽象类中构造和析构均不能使用纯虚函数。 为什么构造函数不能声明为虚函数呢? 1、构造一个对象的时候,必须知道对象的实际...

    一、构造函数不能声明为虚函数

    为什么构造函数不能声明为虚函数呢?

    1、构造一个对象的时候,必须知道对象的实际类型,而虚函数是在运行期间确定实际类型的。如果构造函数为虚函数,则在构造一个对象时,由于对象还未构造成功,编译器还无法知道对象的实际类型,是该类本身还是派生类。无法确定。

    2、虚函数的执行依赖于虚函数表,而虚函数表是在构造函数中初始化的,即初始化vptr,让它指向虚函数表。如果构造函数为虚函数,则在构造对象期间,虚函数表还没有被初始化,将无法进行。

    二、析构函数可以声明为虚函数,而且有时是必须声明为虚函数。

    虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象时,要使用虚析构函数。

    如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。

    所以基本的一条是:无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。

    抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。

    只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

    所以注意如果基类不是虚析构函数的话可能会有以下两点问题:

    1、子类所分配的内存不能被释放
    2、子类中成员变量类所分配的内存也不能被释放,因为子类析构函数没有被调用,其变量的析构函数肯定也没被调用了。

    总之:

    基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。

     

     

     

     

     

    展开全文
  • 1、引子:虚函数表和虚函数指针 ...其中f()和g()是虚函数(当然这里可以定义为纯虚函数,但这样就不能生成类对象了),h()为非虚成员函数。 class Base { public: virtual void f(){}//虚函数 virtual void
  • 抽象基类可以构造函数,在子类需要调用抽象类中的函数或方法时,需要调用构造...只不过很多抽象基类没有过多的成员函数来声明为纯虚函数,所以就用析构函数比较方便;而构造函数是不能为虚函数的。声明为纯虚函...
  • 1、C++纯虚函数和抽象类 2、C++继承中的构造和析构 3、C++之基类的析构函数要声明成虚函数 一. 虚析构函数 为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数虚函数。因为在delete一...
  • 抽象基类的构造函数和析构函数

    千次阅读 2011-12-30 21:35:48
    一直以为抽象函数由于不能创建对象,所以不应该有构造函数和析构函数。今天才知道不是这样的。  抽象基类只是不生成对象实例,但... 只不过很多抽象基类没有过多的成员函数来声明为纯虚函数,所以就用析构函数比较
  • 私有构造函数

    千次阅读 2009-08-12 10:50:00
    A::(){...}构造函数都私有了,什么还能声明类对象a? 还有一直没明白,构造函数私有有啥用?仅仅为了防止建立类的实例?纯虚函数可以啊。 发信人: goer (微笑的夏诺雅), 信区: CPlusPlus标 题
  • 多态与虚函数(C++)

    2018-05-25 14:16:29
    可以将一个虚函数声明为纯虚函数,纯虚函数一般不给出具体实现,因此无法调用纯虚函数。含有纯虚函数的类称为抽象类,抽象类不能创建对象,只能作为父类使用。 注意: 1.构造函数不能声明为虚函数,但是析构函数可...
  • C++理论复习题 SCUT 自动化学院 自动化09-34班 多态与虚函数 单选题 1. 下面描述中正确的是 A. virtual可以用来声明虚函数 B. 含有纯虚函数的类是不可以... 如果一个类至少有一个纯虚函数那么就称该类 A. 抽象类 B.
  • 函数本质

    2019-10-04 04:45:31
    友元函数不能声明为虚函数,但是虚函数可以作为另一个类的友元。 构造函数不可以是虚函数,若声明为虚函数:不会再次构造,没有办法创建子类中父类对象 虚析构函数,让父类指针正确的释放子类对象的内存:先...
  • C++虚析构函数

    2013-08-12 11:16:16
    析构函数可以声明为虚函数。 delete 基类指针; 程序会根据基类指针指向的对象的类型确定要调用的析构函数 基类的析构函数为虚函数,所有派生类的析构函数都是虚函数 构造函数不得是虚函数 如果要...
  • 接口与虚函数的区别

    2019-07-14 19:46:15
    接口只能声明,不能实现,虚函数可以。 接口:对外提供可以访问的函数就叫接口,接口不能有实现,只能声明。虚函数不需要强制被重写,其本身也包含实现的部分。 抽象类就是指定了派生类必须实现的函数(纯虚函数),...
  • C++ virtual关键字

    千次阅读 多人点赞 2017-08-14 19:25:02
    之前始终没有搞清楚C++中 “virtual” 关键字的用法。...静态函数可以声明为虚函数吗 构造函数可以为虚函数吗 析构函数可以为虚函数吗 虚函数可以为私有函数吗 虚函数可以被内联吗 纯虚函数与抽象类
  • 纯虚函数的存在 在C++中,可以定义和调用一个pure virtual function(纯虚函数)。不过它只能被静态地调用(这里是指通过...构造函数不能声明为虚函数,更不能声明为纯虚函数 virtual void interface() = 0; void...
  • 如果将析构函数定义为纯虚函数将面临很多无必要的麻烦,因此一般不建议将析构函数定义为纯虚函数。另外,对于虚函数是否应该声明为const,一般不建议,因为类的设计者不能假设将来需要继承自当前类的行为。 1 无继承...
  • 纯虚基类尽量不要定义数据成员,如果定义了就需要在构造函数或其他成员函数设定初值,不过这通常是一种不好的设计。纯虚基类的纯虚函数可以在派生类中以静态方式调用。声明纯虚析构函数就一定得定义它,什么?...
  • 纯虚基类中若有成员,则需要提供带参数的构造函数,以便子类调用初始化 C++纯虚函数可以被静态调用,如Abstract_base::interface() 。 而pure virtual destructor必须定义,编译器会每一个子类扩展其析构函数,以...
  • 在C++语言中,以下说法正确的是()正确答案: A D 你的答案: A B C (错误)多态是通过虚表实现的构造函数可以声明为虚函数析构函数不可以声明为虚函数抽象类中至少包含一个纯虚函数C++中 的虚函数的作用主要是实现了...
  • 然而,有时我们并不需要某个函数定义为纯虚函数,但是任然希望此类像抽象类一样,不可以创建对象。 方法1:通过确保类中不存在共有构造函数来模拟抽象基类的性质。意味着,我们必须至少显示地声明一个构造函数和一...
  • 抽象类

    2019-04-15 14:50:01
    抽象类为抽象和设计的目的而声明,将有关的数据...对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现 抽象类只能作为基类来使用 不能声明抽象类的对象 构造函数不能是虚函数,析构函数可以是虚函数 ...
  • 类具有可派生性,派生类可以自动获得基类的成员变量和接口(虚函数和纯虚函数,这里我们指的都是public派生)。不过基类的非虚函数则无法再被派生类使用了。这条规则对于类中最为特别的构造函数也不例外,如果派生类...
  • C++面试常错问题摘要

    2016-07-02 10:38:37
    1、指针和引用的区别 (1)引用必须初始化,指针不必; (2)引用初始化后不可改变,指针可以改变所指对象; (3)不存在指向空值的引用,但是存在指向空值...5、构造函数不可声明为虚函数,析构函数可以声明为纯虚函数
  • C++11:通用本,专用

    千次阅读 2013-12-21 11:08:44
    1 派生类可以自动获得基类的成员变量和接口(虚函数、纯虚函数),但是基类的非虚函数则无法被再被派生类使用了,所以派生类要使用基类的构造函数也需要显示声明,当基类的构造函数有多个版本的时候就需要在派生类中透...
  • c++之——抽象基类

    2017-03-16 10:52:00
    在一个虚函数的声明语句的分号前加上 =0;就可以将一个虚函数变成...值得注意的是,你也可以为纯虚函数提供定义,不过函数体必须定义在类的外部。但此时哪怕在外部定义了,也是纯虚函数,不能构建对象。 派生类构造...
  • 多态

    2016-10-07 23:21:46
    虚函数与抽象类可以纯虚函数阻止生成对象。virtual void f() = 0;接口类:有纯虚函数必须多态基类声明virtual析构函数构造函数不能是virtual函数。否则通过基类指针释放子类对象时会造成内存泄漏。
  • c++_多态基础知识

    2017-12-22 18:31:49
    (2,构造函数不能定义虚函数,析构函数可以。 (3,声明需要virtual修饰,定义不用 (4,基类某一函数虚函数,子类同名函数(函数名,参数,返回值),自动成为虚函数 4,纯虚函数:虚函数=0;-> virtu...
  • 类继承 总结

    2019-03-03 22:35:44
    protected继承: 关键字protected 与private相似,在类外...类声明中包含纯虚函数,则不能创建该类的对象。从抽象基类派生出的类的具体特征。 类设计回顾 编译器生成的成员函数 默认构造函数 要么没有参数,要么...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

构造函数可以声明为纯虚函数