`
冇心人
  • 浏览: 55334 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++学习笔记 绝不在构造和析构函数过程中调用virtual函数

阅读更多

假设你有个class继承体系,用来塑模股市交易如买进,卖出的订单等等.这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志中也要创建一笔适当的记录

class Transaction {
public:
     Transaction();
     virtual void logTransansaction() const = 0;



Transaction::Transaction()
{
   ...
   logTransansaction();
}

class BuyTransaction: public Transaction {
public:
    virtual void logTransaction() const;
    ....
}

class SellTransaction: public Transaction {
public:
    virtual void logTransaction() const;
    ....
}

 现在,当一下这行被执行,会发生什么事:

BuyTransaction b;

 五一地会有一个BuyTransaction构造函数被调用,但是首先Transaction构造函数一定会更早被调用.Transaction构造函数的最后一行调用virtual函数logTransaction,这正是引发惊奇的地方.这时候被调用的logTransaction是Transaction内的版本,不是BuyTransaction内的版本.没错!base class构造期间virtual函数绝不会下降到derived clases阶层.取而代之的是对象的作为像隶属base类型一样.非正式的说法或许比较传神:在base class构造期间,virtual函数不是virtual函数.是因为base class构造函数的执行早于derived class构造函数,当base class构造函数执行时derived class的成员变量尚未初始化.

0
0
分享到:
评论

相关推荐

    Effective C++学习笔记

    9. **绝不在构造和析构函数中调用virtual函数**:在构造或析构过程中调用的虚函数会调用当前对象的版本,而非基类版本,这可能导致预期外的行为。 10. **赋值函数返回一个引用指向*this**:返回*this可以使连续赋值...

    c++primer学习笔记(转)

    此外,复制控制涉及到了C++中对象的创建和销毁的过程,包括复制构造函数、赋值操作符和析构函数。复制构造函数用于创建一个新对象作为现有对象的副本,赋值操作符用于对象之间的赋值操作,而析构函数则在对象销毁时...

    c++学习笔记

    在C++学习中,了解和掌握基本概念是至关重要的。首先,C++支持多种源文件扩展,如.cpp、.cc、.cxx以及.C。这些扩展主要用于编译器识别,但实质上,它们都是C++源代码文件。在编程时,常常会引入头文件,如iostream...

    C++虚函数和多态学习笔记

    ### C++虚函数和多态学习笔记 #### 一、虚函数与多态的基本概念 在C++中,虚函数是实现多态的一种机制。多态是指同一个接口(方法名)可以有不同的行为表现,即“一种接口,多种方法”。通过虚函数,我们可以实现...

    C++学习笔记

    《C++学习笔记》 C++是C语言的扩展,是一种强大的、面向对象的编程语言。C++在机制上与C的区别在于它引入了面向对象的特性,通过类的使用,使得代码更加模块化和可复用。C++不仅包含了C的所有特性,还额外增加了...

    C++学习笔记(快速入门C++)

    ### C++学习笔记知识点梳理 #### 一、开始 C++是一种高级编程语言,它是在C语言的基础上发展起来的,并且增加了面向对象编程的支持。学习C++的第一步是从熟悉其基本语法开始,然后逐渐深入理解面向对象编程的概念...

    C++对象模型学习笔记

    ### C++对象模型学习笔记 #### 第1章 关于数据成员 **1.1 单个类** 在探讨C++对象模型时,我们首先关注单个类的数据成员布局及其内部结构。 ##### 1.1.1 没有虚函数存在 当我们定义一个简单的类,如`Point3d`,...

    c++课程学习笔记高亮版

    **C++课程学习笔记高亮版** 这是一份专为C++初学者和进阶者设计的学习资料,基于黑马程序员的C++课程,包含了全面且深入的C++知识点讲解。这份学习笔记采用Markdown格式,使得内容更加清晰易读,便于理解和复习。11...

    C++ Polymorphism 笔记 1

    ### C++ 多态性详解 ...通过本文的学习,读者应该能够掌握如何在实际项目中利用多态性来提高代码的灵活性和可扩展性。多态性是C++面向对象编程的一个强大工具,熟练掌握它可以显著提高编程效率和软件质量。

    C++基础进阶学习资料笔记1.0.zip

    在C++编程语言的学习过程中,基础进阶是一个关键阶段,涉及到许多核心概念和技术。这份"**C++基础进阶学习资料笔记1.0.zip**"包含了一系列深入讲解这些概念的PDF文档,帮助开发者巩固和深化对C++的理解。以下是根据...

    Inside C++ Object Model 读书笔记(暂时第二章)

    总之,《Inside C++ Object Model》深入探讨了C++中构造函数的工作机制,特别是默认构造函数和复制构造函数的合成规则。这些知识对于理解C++的对象创建和初始化过程至关重要,也是优化代码性能和避免潜在问题的基础...

    C++&C学习笔记

    ### C++&C学习笔记知识点概览 #### 类与数据抽象 - **概念**:类是一种用户自定义的数据类型,它将数据(属性)和作用于数据上的操作(方法)封装在一起,从而实现了数据的抽象。 - **特点**:与C语言中的结构体...

    安卓逆向学习笔记之VMP保护的函数的快速逆向分析方法实践篇.docx

    ### 安卓逆向学习笔记之VMP保护的函数的快速逆向分析方法实践篇 #### VMP保护下的函数逆向分析概述 在安卓逆向工程领域,虚拟机保护(Virtual Machine Protection,简称VMP)是一种广泛采用的技术,用于增加应用...

    c++学习笔记w版.docx

    在深入学习C++编程语言的过程中,有几个核心概念和最佳实践是至关重要的。首先,要注重理解和掌握编程思想,而非仅仅关注语言的语法和技术细节。理解程序设计和设计原则,通过不断实践来深化对C++的理解。 C++提供...

    C++基础笔记,到STL库

    C++是一种强大的、通用的编程语言,它在C语言的基础上进行了扩展和增强,引入了面向对象和泛型编程的概念。C++是C的超集,这意味着所有合法的C代码都可以在C++中编译运行。学习C++的基础知识对于初学者来说至关重要...

    《C++ Primer中文版(第5版)》笔记

    C++支持构造函数和析构函数,前者在对象创建时自动调用,后者在对象销毁时执行。 五、继承与多态 继承是面向对象编程中的另一个重要特性,一个类可以从已有的类派生,继承其属性和行为。这允许我们构建层次化的类...

    C++基础和进阶笔记 .docx

    在C++中,多态主要通过虚函数(virtual function)实现,使得基类指针或引用来调用派生类的重写函数成为可能。 五、纯虚函数和抽象类 纯虚函数(pure virtual function)不提供具体实现,用于声明一个接口。含有...

    MFC学习笔记

    **虚函数表机制**使得C++能够在运行时动态地确定调用哪个函数的实现,这是C语言所不具备的功能。在MFC框架中,大量使用了虚函数来实现多态行为,例如在处理消息时,可以重写基类中的虚函数来实现特定的消息处理逻辑...

    C++ 核心编程 学习笔记

    ### C++核心编程学习笔记知识点概述 #### 一、内存分区模型 在C++中,内存被分为四个主要部分:代码区、全局区、栈区和堆区。 1. **代码区**: - **作用**:存放函数体的二进制代码。 - **特点**:由操作系统...

Global site tag (gtag.js) - Google Analytics