码迷,mamicode.com
首页 > 编程语言 > 详细

C++程序设计POJ》《WEEK6 多态与虚函数》《多态的实现原理》《虚函数表》

时间:2019-06-24 23:58:21      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:rtu   输出   多态   using   地址   就是   std   调用   drive   

“多态”的关键在于通过基类指针或引用调用
一个虚函数时,编译时不确定到底调用的是基类还
是派生类的函数,运行时才确定---- 这叫“动态
联编”。“动态联编” 底是怎么实现的呢?

#include<iostream>
using namespace std;
class Base {
public:
    int i;
    virtual void Print()
    {
        cout << "base:print";
    }
};

class Derived :public Base
{
public:
    int n;
    virtual void Print()
    {
        cout << "drived:print" << endl;
    }
};

int main()
{
    Derived d;
    cout << sizeof(Base) << "," << sizeof(Derived);
    while (1);
    return 0;
}
// 程序运行输出结果: 8, 12
// 为什么都多了4个字节?

多态实现的关键--- 虚函数表
每一个有虚函数的类(或有虚函数的类的派生类)
都有一个虚函数表,该类的任何对象中都放着虚函数
表的指针。虚函数表中列出了该类的虚函数地址。
出来的4个字节就是用来放虚函数表的地址的

 

#include<iostream>
using namespace std;
class A
{
public:
    virtual void Func()
    {
        cout << "A::FUNC" << endl;
    }
};
class B :public A
{
public:
    virtual void Func()
    {
        cout << "B::func" << endl;
    }
};
int main()
{
    A a;
    A *pa = new B();
    //64位程序指针为8字节
    long long * p1 = (long long *)&a;
    long long * p2 = (long long *)pa;
    *p2 = *p1; // 更改虚函数表的内容
    pa->Func();
    while (1);
    return 0;

}
// B::Func
// A::Func

 

C++程序设计POJ》《WEEK6 多态与虚函数》《多态的实现原理》《虚函数表》

标签:rtu   输出   多态   using   地址   就是   std   调用   drive   

原文地址:https://www.cnblogs.com/focus-z/p/11080080.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!