首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

虚函数在派生类中声明为非虚拟

虚函数在派生类中声明为非虚拟,这种情况是不符合C++语言规范的。在C++中,如果一个虚函数在基类中被声明为虚函数,那么在派生类中,该虚函数应该继续保持为虚函数,而不是非虚拟。

如果在派生类中将虚函数声明为非虚拟,那么在使用该派生类的对象时,编译器将无法正确地调用该虚函数,从而导致程序错误。因此,建议在派生类中保持虚函数的虚拟性,以确保程序的正确性和可维护性。

如果需要在派生类中重写基类中的虚函数,但不希望该虚函数在派生类中继续保持虚拟性,可以使用“final”关键字来标记该虚函数,表示该虚函数不能被进一步派生类重写。例如:

代码语言:txt
复制
class Base {
public:
    virtual void foo() {
        // ...
    }
};

class Derived : public Base {
public:
    void foo() final {
        // ...
    }
};

在上面的代码中,在派生类中重写了基类中的虚函数“foo()”,并使用“final”关键字标记该虚函数,表示该虚函数不能被进一步派生类重写。这样可以确保程序的正确性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

派生类对基类函数和非虚函数的继承效果

函数的作用,主要是为了让父类指针可以调用子类的函数,这种是在运行时才决定调用哪个函数 1、函数:   C++的函数主要作用是“运行时多态”,父类中提供函数的实现,为子类提供默认的函数实现。...子类可以重写父类的函数实现子类的特殊化。 2、纯函数:   C++包含纯函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯函数的子类才能new出对象。   ...C++的纯函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   C++的纯函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译的,没有运行时多态,只会根据指针或引用的“字面值”类对象,调用自己的普通函数。   普通函数是父类为子类提供的“强制实现”。   ...因此,继承关系,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。 参考链接

8410

C++ 继承函数、纯函数、普通函数,三者的区别

如下就是一个父类函数: class A { public: virtual void out2(string s) { cout<<"A(out2):"<<s<<endl...; } }; 2.纯函数(pure virtual)        C++包含纯函数的类,被称为是“抽象类”。...抽象类不能使用new出对象,只有实现了这个纯函数的子类才能new出对象。   C++的纯函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。   ...C++的纯函数也是一种“运行时多态”。   ...普通函数是父类为子类提供的“强制实现”。   因此,继承关系,子类不应该重写父类的普通函数,因为函数的调用至于类对象的字面值有关。

1.6K30
  • C++之面向对象的三个基本特征

    静态多态性与动态多态性 静态多态性 通过函数重载实现的。缺乏灵活。 动态多态性是通过函数实现的。  C++函数:就是基类声明函数虚拟的,并不是实际存在的函数,然后派生类才正式定义此函数。...函数的作用是允许派生类重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数。...C++规定,当一个成员函数被声明为函数后,其派生类的同名函数都自动成为函数。...Tips: 1)只能用virtual声明类的成员函数,把它作为函数,而不能将类外的普通函数明为函数; 2)一个类的成员函数被声明为函数后i,同一类族的类就不能再定义一个virtual的但与该函数具有相同的参数和函数返回值类型的同名函数...C++,构造函数用于创建对象时进行初始化工作,不能声明为函数

    1.1K60

    学习记录——抽象类和密封类

    ①抽象类 C#允许把类和函数明为abstract,抽象类不能实例化,抽象类可以包含普通函数和抽象函数,抽象函数就是只有函数定义,没有函数体。...抽象类和类成员 通过类定义前面放置关键字 abstract,可以将类声明为抽象类。...继承抽象方法的类无法访问方法的原始实现,因此在上一示例,类 F 上的 DoWork 无法调用类 D 上的 DoWork。通过这种方式,抽象类可强制派生类虚拟方法提供新的方法实现。...②密封类 密封类和类成员 通过类定义前面放置关键字 sealed,可以将类声明为密封类。...在对基类的成员进行重写的派生类上,方法、索引器、属性或事件可以将该成员声明为密封成员。 在用于以后的派生类时,这将取消成员的效果。

    37131

    abstract virtaul override new 及多态

    从抽象类派生的抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。 抽象方法具有以下特性: 抽象方法是隐式的方法。 只允许抽象类中使用抽象方法声明。...通过包括使用 override 修饰符的属性声明,可在派生类重写虚拟继承属性。 派生类 C# 派生类可以包含与基类方法同名的方法。 基类方法必须定义为 virtual。...阻止派生类重写虚拟成员 无论虚拟成员和最初声明虚拟成员的类之间已声明了多少个类,虚拟成员永远都是虚拟的。...在对基类的成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的效果。...因此,你可以源代码调用基类的方法,但执行该方法的派生类版本。

    77430

    C++基础(七).多态(1)

    函数必须是类的静态成员函数(且构造函数),其访问权限是public 函数的作用是实现动态联编,也就是程序的运行阶段动态地选择合适的成员函数定义了函数后,可以基类的派生类函数进行重新定义...派生类定义的函数应与函数具有相同的形参个数和形参类型(覆盖),以实现统一的接口,不同定义过程。...,则把它声明为函数,它的实现留给该基类的派生类去做 纯函数的作用是为派生类提供一个一致的接口(纯函数相当于接口,不能直接实例化,需要派生类来实现函数定义) ---- 函数与纯函数的区别 1)...抽象类是不能定义对象的,实际为了强调一个类是抽象类,可将该类的构造函数明为保护的访问控制权限 抽象类的主要作用是将有关的组织一个继承层次结构,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的...如果派生类给出了基类纯函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了 抽象类,既可以有抽象方法,也可以有具体方法或者叫抽象方法。

    49520

    C++ OOP面向对象

    只有类的普通成员函数可以定义为函数,全局函数及静态成员函数(类拥有)不能声明为函数。 只有用virtual声明类的成员函数,使之成为函数,不能将类外的普通函数明为函数。...因为函数的作用是允许派生类对基类的函数重新定义。所以函数只能用于类的继承层次结构。...拓展 根据什么考虑是否把一个成员函数明为函数 看成员函数所在的类是否会作为基类 看成员函数类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该将它声明为函数。...Q: 纯函数 A: virtual 函数类型 函数名(形参表列)=0; 抽象类定义的,为了派生类的使用而声明定义的,其基类没有任何意义 Q: 析构函数/纯析构函数 A: 如果将基类的析构函数明为函数时...抽象类实现的具体方法默认为的,但实现接口的类的接口方法却默认为非虚的,当然您也可以声明为的。 (接口)与抽象类类似,抽象类也必须为该类的基类列表列出的接口的所有成员提供它自己的实现。

    88710

    【C++篇】继承之巅:超越法则束缚,领略面向对象的至臻智慧

    3.1.1 基类函数与多态 这里先大致看一下,之后会有专门讲解多态的文章滴 多态机制,基类的函数被声明为函数(virtual)后,派生类可以对该函数进行重写(override)。...3.2 虚拟继承的注意事项 3.2.1 构造函数的调用顺序 使用虚拟继承时,基类的构造函数调用顺序会略有不同。基类总是最先被初始化,无论基类是继承链中出现的位置。...即使 A 类作为基类出现于 B 和 C 的虚拟继承 D 的构造过程,A 的构造函数仍然是最先被调用的。...传统继承则直接将基类对象的数据存储派生类对象。 传统继承的内存布局:派生类对象包含每个基类对象的数据。 虚拟继承的内存布局:派生类对象通过基表定位到唯一的基类实例。...5.2 常见继承误区与陷阱 实际开发,继承的使用容易出现一些常见的误区和陷阱,以下是几个需要特别注意的点: 5.2.1 忽视析构函数的定义 当基类的析构函数未被声明为 virtual 时,通过基类指针删除派生类对象

    13210

    C++ 重载运算符 继承 多态 (超详细)

    (2)派生类的生成过程 吸收基类成员:除构造和析构函数外 改造基类成员:通过派生类定义同名成员屏蔽基类成员派生类中直接调用,仍可以基类指针调用同名成员 .添加新成员 (3)派生类特点 子类拥有父类除了父类构造和析构函数...声明为指向基类对象的指针,当其指向公有派生类对象时,只能用它来直接访问派生类从基类继承来的成员,而不能直接访问公有派生类的定义的成员。...5)C++纯函数 1.纯函数基类声明的函数,它在基类没有定义,但要求任何派生类都要定义自己的实现方法。...基类实现纯函数的方法是函数原型后加“=0” virtual void funtion()=0 1、为了方便使用多态特性,我们常常需要在基类定义虚拟函数。...{ } } 为了解决上述问题,引入了纯函数的概念 Class animals { virtual void mingjiao()=0; } 则编译器要求派生类必须予以重写以实现多态性。

    1.1K21

    【C++】自学终极笔记

    函数: 纯函数基类声明但没有实现的函数,通过声明中使用 = 0 来标记。任何包含纯函数的类都被认为是抽象类,不能被实例化。...: 基类通过使用 virtual 关键字声明函数,virtual 关键字基类必须要用,而派生类可以省略。...派生类,使用 override 关键字可以显式地表明这是对基类函数的重写【也可以没有】。...在对象构造的过程表还没有被构建,因此无法实现函数的多态性。 析构函数应该声明为函数: 如果类包含函数,通常应该将析构函数明为函数。...这确保使用基类指针指向派生类对象时,可以正确调用派生类的析构函数,避免内存泄漏。 纯函数: 纯函数本身在基类没有具体的实现,而是派生类中被强制要求实现。

    22310

    【C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承的二义性和数据冗余问题

    Derived 类可以访问 Base 类明为 public 的成员。 C++多继承 多继承允许一个类继承自多个基类。这意味着派生类可以有多个直接的基类。...菱形继承派生类会继承两个基类的所有公共和私有成员。...如果这些成员两个基类定义了相同的实现,那么派生类可能会有重复的代码,这不仅增加了代码量,还可能导致维护困难,因为需要在所有相关的实现同步更新。...基类:继承,被继承的类被称为基类。 基类的成员变量和成员函数子类只会存在一份,避免了冗余性问题。...6、多继承时的继承:当多个类同时virtually继承同一个基类时,基类的成员变量和成员函数子类只会存在一份,避免了冗余性和二义性问题。

    21620

    C++11显式函数重载:override与final

    场景 传统C++,经常容易发现意外重载函数的事情: struct Base { virtual void foo(); }; struct SubClass: Base { void...但是因为形参列表不同导致编译器认为这是一个新定义的成员函数 当基类的函数Base::foo被删除后,SubClass::foo就不再重载该函数而摇身一变成为一个普通的成员函数 override 一旦类的某个函数被声明为函数...,那么在所有的派生类它都是函数。...派生类如果定义了一个函数与基类函数的名字相同但是形参列表不同,编译器会认为新定义的函数与基类中原有的函数是相互独立的。...这会带来一个问题:如果我们本来希望派生类可以覆盖掉基类函数,但是一不小心把形参列表写错了,这可能与我们的本意不符。

    1.3K30

    c#多态性   静态多态性函数重载 动态多态性 方法:

    面向对象编程范式,多态性往往表现为"一个接口,多个功能"。 多态性可以是静态的或动态的。静态多态性函数的响应是在编译时发生的。动态多态性函数的响应是在运行时发生的。...通过类定义前面放置关键字 sealed,可以将类声明为密封类。当一个类被声明为 sealed 时,它不能被继承。抽象类不能被声明为 sealed。...: 当有一个定义函数需要在继承类实现时,可以使用方法。...以下实例创建了 Shape 基类,并创建派生类 Circle、 Rectangle、Triangle, Shape 类提供一个名为 Draw 的虚拟方法,每个派生类重写该方法以绘制该类的指定形状。...3.抽象方法必须在派生类重写,这一点和接口类似,方法不需要再派生类重写。 简单说,抽象方法是需要子类去实现的。方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。

    1.5K10

    后台开发:核心技术与应用实践 -- C++

    函数 的作用是允许派生类重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数。...函数的声明方式: virtual 返回类型 函数名(); 当把基类某个成员函数明为函数后,就允许在其派生类对该函数重新定义,赋予它新的功能,且可以通过指向基类的指针指向同一类族不同类的对象,从而调用其中的同名函数...函数实现了同一类族不同类的对象可以对同一函数调用作出不同的响应的动态多态性。 C++规定,当某个成员函数被声明为函数后,其派生类的同名函数都自动成为函数。...纯函数基类声明的函数,它在基类没有定义,但要求任何派生类都要定义自己的实现方法。...C++,,构造函数不能声明为函数,这是因为编译器构造对象时,必须知道确切类型,才能正确地生成对象;其次,构造函数执行之前,对像并不存在,无法使用指向此对像的指针来调用构造函数

    1.3K10

    c#的多态学习总结

    面向对象编程范式,多态性往往表现为"一个接口,多个功能"。 多态性可以是静态的或动态的。静态多态性函数的响应是在编译时发生的。动态多态性函数的响应是在运行时发生的。...记得侯捷的视频,大师提到过,函数名是一样的,但是编译器其实已经做了标记,底层函数名称是不一样。 函数重载和c++类似,这里不细谈了。总之一点就通过函数参数来重载的。...c、通过类定义前面放置关键字sealed,可以将类声明为密封类。当一个类被声明为 sealed时,它不能被继承。抽象类不能被声明为 sealed。...,a); Console.ReadKey(); } } } 2.2方法之virtual 当有一个定义函数需要在继承类实现时,可以使用方法。...以下实例创建了 Shape 基类,并创建派生类 Circle、 Rectangle、Triangle, Shape 类提供一个名为 Draw 的虚拟方法,每个派生类重写该方法以绘制该类的指定形状。

    82020

    C++函数

    这样就可以派生类重新定义此函数,为它赋予新的功能,并能方便地被调用。     类外定义函数时,不必再加virtual。...(2)派生类重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的函数相同,并根据派生类的需要重新定义函数体。    ...C++规定,当一个成员函数被声明为函数后,其派生类的同名函数都自动成为函数。    ...如果在派生类没有对基类的函数重新定义,派生类简单地继承其直接基类的函数。 (3)定义一个指向基类对象的指针变量,并使它指向同一类族需要调用该函数的对象。...(2)如果成员函数类被继承后功能不需要修改,或派生类用不到该函数,则不要把它声明为函数

    1.1K30

    轻松搞定面试的“

    包括:函数,纯函数基类,继承... 1.什么是函数,有什么作用? 基类用virtual声明成员函数函数。这样就可以派生类重新定义此函数,为它赋予新的功能,并能方便地被调用。...函数的作用是允许派生类重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数,达到多态的目的。 2.什么是纯函数,什么是纯类,有什么作用?...纯函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统:“在这里声明一个函数,留待派生类定义”。派生类对此函数提供定义后,它才能具备函数的功能,可被调用。...基类构造的时候,函数是非虚,不会走到派生类,既是采用的静态绑定。...虚拟继承与普通继承不同的是,虚拟继承可以防止出现diamond继承时,一个派生类同时出现了两个基类的子对象。也就是说,为了保证这一点,虚拟继承情况下,基类子对象的布局是不同于普通继承的。

    67620

    C++基础-多态

    可将基类的析构函数明为函数,那么函数返回时,作为实参的派生类指针就会被当作派生类指针进行析构。...纯函数和抽象基类 C++ ,包含纯函数的类是抽象基类。抽象基类用于定义接口,派生类实现接口,这样可以实现接口与实现的分离。抽象基类不能被实例化。...抽象基类提供了一种非常好的机制,可在基类声明所有派生类都必须实现的函数接口,将这些派生类必须实现的接口声明为函数即可。...使用 override 明确表明覆盖意图 从 C++11 起,程序员可使用限定符 override 来核实被覆盖的函数基类是否被声明为函数。...• 派生类中被声明为 override 的函数是否是基类对应函数的覆盖?确保没有有手误写错。 编程实践:派生类声明要覆盖基类函数函数时,务必使用关键字 override 7.

    85720

    从零开始学C++之函数与多态(二):纯函数、抽象类、析构函数

    如形状类Shape 解决方法 将这些接口定义为纯函数 基类不能给出有意义的函数定义,这时可以把它声明成纯函数,把它的定义留给派生类来做 定义纯函数: class 类名{        ...virtual 返回值类型 函数名(参数表) = 0;     }; 纯函数不需要实现 二、抽象类 作用 抽象类为抽象和设计的目的而声明,将有关的数据和行为组织一个继承层次结构,保证派生类具有要求的行为...对于暂时无法实现的函数,可以声明为函数,留给派生类去实现。 注意 抽象类只能作为基类来使用。 不能声明抽象类的对象。...构造函数不能是函数,析构函数可以是函数 1、抽象类不能用于直接创建对象实例,可以声明抽象类的指针和引用 2、可使用指向抽象类的指针支持运行时多态性 3、派生类必须实现基类的纯函数,否则它仍将被看作一个抽象类...特别是派生类析构函数需要完成一些有意义的操作,比如释放内存 析构函数还可以是纯的。

    1.4K00

    【C++篇】灵动之韵:C++多态之舞,赋予代码生命的艺术

    函数:基类函数必须被声明为 virtual,以便在派生类可以对其进行重写。 基类指针或引用:通过基类的指针或引用来指向派生类的对象。...2.5 覆盖、隐藏与重载(易混淆点解析) 多态,理解覆盖、隐藏和重载的区别非常重要: 覆盖(Override):派生类重新定义基类明为 virtual 的函数函数签名相同。...2.6 协变(Covariance) C++ 派生类可以重写基类函数时使用与基类函数返回类型不同的返回类型。这种返回值类型的变化被称为协变。...为了防止这种疏忽,C++11 提供了 override 关键字,可以显式声明派生类函数重写基类的函数。...3.3 常见的多态错误与调试 使用多态的过程,一些常见的错误包括: 基类析构函数未声明为函数:当基类的析构函数未声明为 virtual,通过基类指针删除派生类对象时,派生类的析构函数不会被调用,可能导致内存泄漏

    17110
    领券