`

C++之对象切割

 
阅读更多
转自
http://www.cnblogs.com/biyeymyhjob/archive/2012/09/07/2674880.html

问题描述

程序如下:
#include <iostream>
#include <cstdlib>

using namespace  std;

class Base
{
      public:
             virtual void fun()
             {
                     cout << "Base fun() is Called"  << endl;
             }
};


class Derived:public Base
{
      public:
             void fun()
             {
                  cout << "Derived fun() is Called" << endl;
             }
             
};

void fun1(Base b)
{
     b.fun();
}

void fun2(Base *b)
{
     b->fun();
}

void fun3(Base &b)
{
     b.fun();
}

int main()
{
    Derived d;
    fun1(d);
    fun2(&d);
    fun3(d);
       
    system("pause");
    return 0;
}



最后的执行结果:



原因解释
从上面可以看出 指针和地址传递可以实现虚函数的多态功能,而在fun1(Base b)中 传递Derived对象时发生了的对象切割,而对象切割不会发生多态,所以调用Base当中对应的函数。

综上:多态的实现是通过指针和引用;而对象的转换只会造成对象切割,不能实现多态,根本原因是C++虚函数的多态是通过VTable实现的
分享到:
评论

相关推荐

    数学建模钢材切割问题使用c++实现的程序

    C++作为编程语言,它支持面向对象编程,拥有丰富的标准库,能够方便地处理数据结构和算法。在解决钢材切割问题时,可能会用到数组或者链表来存储钢材信息,用排序算法优化切割顺序,以及动态规划或贪心策略来求解最...

    C#调用c++ vidoClip.dll进行视频切割

    然后在`Cut`方法中,我们把C#的TimeSpan对象转换成C++能识别的double类型时间,并调用`CutVideo`函数进行实际的切割操作。 在实际项目中,除了调用函数外,还需要考虑错误处理、异常捕获、资源管理等方面的问题。...

    基于镜头级别的视频切割器

    C++的面向对象特性也使得代码结构清晰,易于维护和扩展。 视频切割的核心在于识别镜头转换,这通常涉及到运动检测、画面内容变化分析等技术。用户可以自定义阈值,这个阈值用于判断两个连续帧之间的差异是否足以...

    C++对象内存池 ---- C++侦探改写.rar

    本资源"ObjPool.h"可能是一个实现了C++对象内存池的头文件,由"C++侦探改写",可能是对原内存池实现的分析和改进。下面我们将深入探讨C++对象内存池的原理、设计以及可能的优化策略。 内存池的基本思想是预先分配一...

    vs C++ 截屏为BMP图片,分割BMP图片

    可以将图片看作二维数组,根据需要的大小和位置切割成多个子图像。这可以通过遍历原始BMP文件的像素数据并创建新的BMP文件来实现。 在VS2019中,你可以使用MFC(Microsoft Foundation Classes)或WinAPI来编写这个...

    基于c++的拼图小游戏

    在这个项目中,学生通过学习C++基础知识,理解面向对象编程原理,并结合图形用户界面(GUI)技术,实现了一个互动的拼图游戏。 首先,C++是一种强大的静态类型编程语言,以其高效、灵活和面向对象的特点广泛应用于...

    C++拼图小游戏

    《C++拼图小游戏》是基于Visual C++开发的一个经典编程示例,它涉及的知识点广泛,涵盖了C++语言的基础语法、面向对象编程思想、图形用户界面设计以及算法设计等多个方面。下面将对这些关键知识点进行详细阐述。 ...

    C++内存池实现

    内存池是一种优化内存分配策略的技术,它在C++编程中被广泛应用,特别是在处理大量小对象分配和释放时,能够显著提升程序性能。本项目提供的是一个自定义实现的C++内存池,包括文档和源代码,旨在帮助理解内存池的...

    在 C++ 中 使用纹理和颜色特征进行图像分割_ C++_代码_下载

    大多数可用的库都提供了仅基于分水岭、图形切割和类似方法执行自动分割的功能。这些方法没有考虑图像的纹理属性。本周,我们分析了图像的两个简单但非常关键的特征:纹理和颜色。我们已经使用这些特性来实现我们自己...

    C++拼图游戏 单机游戏

    6. **多态与面向对象设计**:C++支持面向对象编程,可以利用类和对象来封装游戏元素,如拼图块、游戏状态等。多态性则可以确保代码的灵活性和可扩展性。 7. **文件操作**:游戏可能需要保存和加载进度,这就涉及到...

    C++拼图游戏

    1. **类与对象**:在C++中,你可以定义一个`Puzzle`类,用于存储拼图的相关信息,包括原始图像、分割后的块、当前游戏状态等。每个拼图块可以是`PuzzleBlock`类的实例,包含位置、图像数据等属性。 2. **文件操作**...

    gdal 线段切分polygon 或 线段(切分结果为新的模型)

    6. **保存结果**:最后,将切分后的几何对象和切割点写入新的数据源,以便进一步分析或展示。 在TDVectorCalculation.cpp和TDVectorCalculation.h这两个文件中,可能包含了实现上述步骤的具体代码。例如,`...

    C++项目天天拼图源码-PinTu.zip

    2. **面向对象编程**:C++是一种支持面向对象编程的语言,PinTu项目中可能包含了类的定义、对象的创建、封装、继承和多态等面向对象特性。通过分析源码中的类结构,可以了解如何设计和实现复杂的软件系统。 3. **...

    C++ 并发多线程日志处理

    通过创建`std::thread`对象,可以将函数或成员函数作为参数,这样这些函数就会在新的线程上下文中执行。例如: ```cpp #include #include void logFunction() { std::cout ; } int main() { std::thread log...

    KINECT C++试验版的切水果

    在这个项目中,开发者选择C++作为主要编程语言,可能是因为C++可以直接操作硬件资源,提高程序效率,同时C++的面向对象特性也便于构建复杂的游戏逻辑。 【OpenCV】是一个开源计算机视觉库,它包含了大量的图像和...

    C++设置ROI区域

    本篇文章将详细介绍如何在C++中设置ROI区域以及进行图像切割的相关知识点。 首先,我们需要了解基本的图像处理库。在C++中,OpenCV是一个非常流行的开源库,提供了丰富的图像处理函数,包括设置ROI和图像切割。安装...

    拼图游戏C++的源码

    1. **C++编程基础**:C++是一种静态类型、编译式的面向对象程序设计语言。它具有丰富的类库支持,可以进行底层操作,同时支持面向对象编程。源码中的结构、函数定义、对象实例化等都是C++的基本概念。 2. **图形...

    C++编写的类似水果忍者的切水果的效果

    这个项目对于初学者来说是个很好的实践,因为它涵盖了C++的基础知识,如对象导向编程、图形库的使用以及事件处理,同时也能帮助开发者理解游戏逻辑的构建。 首先,我们要了解C++的基本语法和特性。C++是一种静态...

    C++拼图游戏最全源代码

    通过分析这个C++拼图游戏源代码,初学者可以学习到C++语言基础、图形编程、数据结构与算法、面向对象设计原则等多个方面的知识。这不仅有助于提升编程技能,还有利于理解游戏开发的整体流程,为将来更复杂的游戏项目...

    c++裁剪感兴趣区域

    在更复杂的场景中,可能会用到深度学习模型,如YOLO(You Only Look Once)或SSD(Single Shot MultiBox Detector),它们能自动检测并裁剪出图像中的特定对象。 在实际应用中,裁剪感兴趣区域常用于人脸识别、目标...

Global site tag (gtag.js) - Google Analytics