`

Item 9 避免在ctor和dtor中调用虚函数

阅读更多

看下面的程序有什么问题。

在基类的构造过程中,虚函数调用不会被传递到派生类中。因为基类的ctor是在派生类之前执行的,这时其数据成员还没有被初始化,即,派生对象还不存在!所以C++拒绝这样做。
不止虚函数,使用到RTTI的部分(dynamic_cast和typeid),在基类的ctor里,都不会被解析成派生类。
ctor和dtor同样。
一些编译器会对此给出警告。

● 注意,还有一种隐藏版本:

● 如果非要在基类里实现这样的功能,怎么办?下面是一种办法。

分享到:
评论

相关推荐

    Exceptional C++ 47个疑难问题详解 PDF格式

    5. **构造与析构(Ctor & Dtor)**:理解构造函数和析构函数的工作原理是C++对象生命周期管理的关键。书中可能讨论构造链、虚析构函数、资源获取即初始化(RAII)原则等。 6. **多态(Polymorphism)**:C++的多态包括...

    bad_function_call_ctor.rar_BAD

    本话题聚焦于“bad_function_call_ctor.rar_BAD”这个压缩包,其中包含了两个文件:`i915_drm.c`和`bad_function_call_ctor.pass.c`,它们涉及到Linux内核中的Intel图形驱动(i915)以及可能存在的错误函数调用构造...

    sap笔试题(c ).doc

    - **虚函数表**:C++ 中的虚函数通过虚函数表实现,每个派生类都有自己的虚函数表,指向各个虚函数的地址。这使得通过基类指针调用虚函数时能够正确地定位到派生类的方法。 ### 总结 本文基于提供的文档信息,深入...

    param_ctor_func.rar_Make It!

    1. `main.c`:这是C语言的主要源代码文件,通常包含程序的主入口点`main()`函数和其他核心逻辑。 2. `param_ctor_func.pass.c`:此文件名暗示它可能包含一个参数构造函数的实现或者一个关于构造函数的测试用例,"....

    param_ctor.rar_The Media

    在给定的压缩包文件中,有两个文件:`mediarecorder.c`和`param_ctor.pass.c`。从名字来看,`mediarecorder.c`可能是关于MediaRecorder的C语言实现或者与之相关的原生库代码,而`param_ctor.pass.c`可能涉及到构造...

    ctor_char16_t.rar_The Other

    综上所述,这个压缩包中的内容可能涵盖了C++11的`char16_t`类型,统一初始化语法,以及与之相关的构造函数和特定情况下的初始化方法。通过分析这些文件,我们可以更深入地理解如何在C++中正确和安全地处理宽字符类型...

    全局对象构造与析构机制剖析

    这种初始化和清理过程涉及到构造函数和析构函数的调用,而这背后隐藏的是编译器和链接器的一系列机制,尤其在使用g++编译器和GCC工具链时更为显著。 ### g++支持全局对象构造/析构的机制 g++通过特定的段(section...

    child-process-ctor-Node.js4childProcess.ChildProcessponyfill.

    2. `lib/`目录:可能包含了实现`ChildProcess`功能的各种辅助函数和类。 3. `test/`目录:测试用例,用于验证`ponyfill`的正确性和兼容性。 4. `package.json`:项目配置文件,包含项目信息、依赖、脚本等。 5. `...

    Delphi面向对象编程思想

    这两个函数分别以构造函数前缀`ctor`和析构函数前缀`dtor`标识。 6. 异常处理:Delphi支持异常处理机制,通过try-finally和try-except语句块可以捕获和处理运行时错误。这有助于编写健壮的代码,确保即使在发生错误...

    ctor_char32_t.rar_memory

    综上所述,这个项目涉及到了Xlib窗口系统中的内存管理,特别是软件渲染的实现,包括如何在内存中维护窗口内容以及与之相关的构造函数的使用和测试。深入理解这个主题,开发者需要熟悉Xlib API,理解操作系统内存管理...

    rust-ctor:Rust的模块初始化全局构造函数

    rust-ctor:Rust的模块初始化全局构造函数

    param_ctor_default.rar_back

    5. **C语言编程**:由于文件扩展名是.c,这意味着代码是用C语言编写的,因此需要理解C语言的语法、内存管理、函数调用和预处理器宏等概念。 6. **编译与链接**:理解如何将这些源文件编译为可执行文件,可能需要...

    param_ctor.rar_Over

    标题中的“param_ctor.rar_Over”可能是指一个与网络协议栈相关的项目或软件包,其中“param_ctor”可能是参数构造器或初始化模块,而“Over”可能是强调它在某种技术上的应用,比如“IP over ATM”。 描述中提到的...

    每天学点C++(C++实例教程:教程+源码)类的继承.zip

    派生类的构造函数可以调用基类的构造函数初始化基类部分,使用语法`base_class(ctor_args)`。 7. **覆盖与重载**: 派生类可以重新定义基类的虚函数,这称为覆盖,保持相同的函数签名。非虚函数的重载则可以在...

    param_ctor_iterator.rar_Modified

    1. **OpenMAXAL.c**:这很可能是OpenMAX AL API的实现或测试代码,包含了核心的函数和结构体定义,可能包括音频设备的初始化、音频流的管理和数据传输等功能。 2. **param_ctor_iterator.pass.c**:文件名中的...

    C#软件开发规范经典

    4. Ctor, Init, Dtor:构造函数、初始化方法和析构函数在这里声明。窗体类的特定事件处理方法也应在此定义。 5. Method:主要的对外接口方法(如Open, Close等)在此处声明,这些方法代表类的核心功能。 6. Function...

    C++ Interview Questions

    这非常重要,尤其是在派生类中,因为当通过基类指针删除派生类对象时,若析构函数不是虚函数,则只会调用基类的析构函数而忽略派生类中的任何清理操作。因此,为了确保正确地释放资源,建议将基类的析构函数声明为虚...

    C++- THE GOOD, BAD, AND UGLY.pdf

    正确地使用构造函数和析构函数可以确保资源的正确释放,避免内存泄漏。在C++的类设计中,应尽量避免裸指针的使用,而是采用智能指针(如std::unique_ptr或std::shared_ptr),这样可以利用RAII(资源获取即初始化)...

    C# 构造函数如何调用虚方法

    在C#中,用virtual关键字修饰的方法(属性、事件)称为虚方法(属性、事件),表示该方法可以由派生类重写(override)。虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态成为可能。 然而虚方法的使用...

    程序员的自我修养——运行库

    - **全局构造与析构的发生位置**:全局对象的构造和析构发生在特定的段(section)中,通常被称为`.ctor`段和`.dtor`段。在程序启动时,运行库会执行`.ctor`段中的构造函数;而在程序退出时,则执行`.dtor`段中的析...

Global site tag (gtag.js) - Google Analytics