#include <iostream>

using namespace std;
/* 每个类都有一张虚方法表,当基类为虚方法,而派生类重载了虚方法,
* 则虚方法表中的基类方法被派生类替换
*/
class AClass{
    public:
        AClass(){
            cout << this << " 基类构造" << endl;
        }
        virtual ~AClass(){
            cout << this << " 基类析构" << endl;
        }
        void Amothod1(){
            cout << "基类方法1" << endl;}
        virtual void Amothod2(){
            cout << "基类方法2" << endl;}
        void Amothod3(){
            cout << "基类方法3" << endl;}
};
class BClass:public AClass{
    public:
        BClass(){
            cout << this << " 派生类构造" << endl;
        }
        virtual ~BClass(){
            cout << this << " 派生类析构" << endl;
        }
        void Amothod1(){
            cout << "派生类方法1" << endl;}
        void Amothod2(){
            cout << "派生类方法2" << endl;}
};

int main()
{
    AClass * a = new AClass;// 基类指针操纵基类实例
    a->Amothod1();// 调用基类方法1
    a->Amothod2();// 调用基类方法2
    a->Amothod3();// 调用基类方法3
    delete a;
    cout << "***虚方法不影响指向基类实例的基类指针***" << endl;

AClass * a1 = new BClass;// 基类指针操纵派生类实例
    a1->Amothod1();// 调用基类方法1
    a1->Amothod2();// 调用派生类方法2
    a1->Amothod3();// 调用基类方法3
//    ((BClass *)a1)->Amothod1();// 等效于b->Amothod1();
//    ((BClass *)a1)->Amothod2();// 等效于b->Amothod2();
//    ((BClass *)a1)->Amothod3();// 等效于b->Amothod3();
    delete a1;
    cout << "***虚方法影响指向派生类实例基类指针***" << endl;

BClass * b = new BClass;// 派生类指针操纵派生类实例
    b->Amothod1();// 调用派生类方法1
    b->Amothod2();// 调用派生类方法2
    b->Amothod3();// 调用基类方法3
//    ((AClass *)b)->Amothod1();// 等效于a1->Amothod1();
//    ((AClass *)b)->Amothod2();// 等效于a1->Amothod2();
//    ((AClass *)b)->Amothod3();// 等效于a1->Amothod3();
    delete b;
    cout << "***如果不重载基类公共方法,将直接调用基类方法***" << endl;

return 0;
}

c++ 每个类都有一张虚方法表相关推荐

  1. 807-C++多继承下,派生类对象有几张虚函数表?

    C++多继承下,派生类对象有几张虚函数表? 我们看下面这个示例: #include <iostream> #include <string> #include <type ...

  2. 虚方法表与动态分派机制详解

    在上两篇中分别对方法重载[https://www.cnblogs.com/webor2006/p/9723289.html]和方法重写[https://www.cnblogs.com/webor200 ...

  3. 方法的调用:虚方法表

    在面向对象的编程中,会很频繁的使用到动态分派,如果在每次动态分派的过程中都要重新在类的方法元数据中搜索合适的目标的话就可能影响到执行效率.因此,为了提高性能,JVM采用在类的方法区建立一个虚方法表 ( ...

  4. 纯虚类(virtual class)和纯虚方法(pure virtual function)

    具体内容参加绿皮书, virtual method class Transaction;rand bit[31:0] src,dst,data[8];bit[31:0]crc;virtual func ...

  5. delphi 类class自定义类方法虚方法

    刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视化构件库).仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容 易地做出一个有实用价值的程序,真是令人激动.但是,VCL只是 ...

  6. 【M24】了解虚方法、多继承、虚基类、RTTI的成本

    1.编译器必须实现出C++语言的特性.一般情况下,我们只需要使用这些特性就好了,不需要关心内部的实现细节.但是,有些特性的实现,会对对象的大小和成员方法的执行速度造成影响.因此,有必要了解内部实现的细 ...

  7. C++ day22 继承(二)基类指针数组通过虚方法实现智能的多态

    继承一共有三种: 公有继承 私有继承 保护继承 文章目录 公有继承 基类和派生类的关系 is-a(用公有继承表示"是一种"的关系) has-a uses-a is-like-a i ...

  8. C# 多态(接口、虚方法、抽象类)的理解

    这几天正在做GDI+的一个练习程序,参考了<VC#.NET开发交互式CAD系统>这本书,书中的参考方法创建了许许多多的类和一个接口.开始我还在想接口有啥作用啊?是不是有点多此一举.然后就去 ...

  9. 虚方法与隐藏方法异同之我见

    虚方法和隐藏方法从本质上来说,他们的目的是一样的,都是为了让对象在保证具有基类的共性的同时能够发挥出自己的个性,但不同的是,他们俩的作用范围不一样.隐藏方法的作用范围局限于指向派生类的派生类的引用,而 ...

最新文章

  1. linux内核经常用到的 一个概念“原子操作“
  2. Istio 1.3 发布:HTTP 遥测不再需要 Mixer
  3. 二级域名做SEO优化有怎样的利弊关系?
  4. 千家BBS系列-技术宝典(免费下载软件)
  5. 6个月达不到25.6万年薪AI工程师,进不了大厂全额退款
  6. socket编程总结
  7. 方法级权限控制-@Secured注解使用
  8. mysql 在时间上加120s_sqlserver日期推算(年,季度,月,星期推算)
  9. Python学习笔记之常用模块总结,持续更新...
  10. 高吞吐低延迟Java应用的垃圾回收优化
  11. Illustrator 教程,如何在 Illustrator 中创建和编辑作品?
  12. UOS (deepin)刻录u盘安装系统
  13. AD9854PCB的绘制以及调试中存在的问题以及解决方法
  14. 如何在海外做游戏代理?
  15. python爬虫爬取qq音乐热歌榜的歌曲到本地
  16. java lstm pb_在Tensorflow Serving上部署基于LSTM的文本分类模型
  17. 计算机组成:中断向量的相关计算
  18. Webix JavaScript UI 9.1.6
  19. 优麒麟linux安装教程,百度网盘Linux版安装指引:搭配优麒麟运行更完美
  20. 数量金融学(6):TIPP策略

热门文章

  1. ArcGIS中的 Map 对象
  2. 我的2018:自由职业的冰火两重天
  3. Prodigal-原核生物基因预测
  4. 飞书面临3个劣势,那又怎样?
  5. “我才是腾讯的第一任董事长”
  6. 我的博客开通啦,以后会记录一位IT女的学习生涯
  7. 【系统分析师之路】系统分析师通过人数与通过率探秘
  8. 7.2某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析: A、B 至少有一人作案; A、E、F 三人中至少有两人参与作案; A、D 不可能是同案犯; B、C 或同时作案,或与本案无关;
  9. Code jam 2008 practice A
  10. greenplum数据库单机部署