zoukankan      html  css  js  c++  java
  • C++多态

    类似代码如下:
    class A
    {
    public:
        virtual void Test(){}
    };

    class B:public A
    {
    public:
       virtual void Test(){}
    };

    B b;
    A a = b;
    A * pA = &b;

    a.Test();
    pA->Test();

    大家都知道a.Test调用的是A::Test,而pA->Test调用的是B::Test,那么为什么呢?

    首先来看a.Test;其实很容易理解,这里的a就是一个A类型的变量,它的内存布局在赋值的时候已经从B转换到A了,多于的数据都被丢弃,b对象的虚函数表不会被复制,A a时内存里已经有a的虚函数表了,因此其就是一个A类型的变量。
    而对于pA来说,其是一个指针,其类型虽然是A,但指向的区域的内容却是一个B类型的内存结构,虽然内存结果的布局与A兼容,但其虚函数表中的Test却是B的实现;因此如上面所说。同样引用也会达到如此的效果。

    Java里面实现就不同,A a = b这个再java里就是传递引用,相当于A * pA = &b;

    我想这就是所说的指针和引用不会引发内存中任何“与类型有关的内存委托操作”吧。

    转载网址:http://www.cppblog.com/windcsn/archive/2011/04/06/143482.html

  • 相关阅读:
    2019-11-12-WPF-添加窗口消息钩子方法
    2018-11-21-WPF-解决-ViewBox--不显示线的问题
    ARRAY_SIZE宏
    tcp校验和
    arp命令
    sk_buff
    printf打印字节
    dmesg命令
    insmod/rmmod
    ifup/ifdown
  • 原文地址:https://www.cnblogs.com/chester/p/2021490.html
Copyright © 2011-2022 走看看