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

Posted focus-z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++程序设计POJ》《WEEK6 多态与虚函数》《多态的实现原理》《虚函数表》相关的知识,希望对你有一定的参考价值。

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

#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 多态与虚函数》《多态的实现原理》《虚函数表》的主要内容,如果未能解决你的问题,请参考以下文章

C++程序设计POJ》《WEEK6 多态与虚函数》《编程填空》

C++之多态性与虚函数

C++多态性与虚函数

C++的探索路14多态与虚函数之基础篇

C++的探索路15多态与虚函数之高级篇

C++的探索路16多态与虚函数之练习篇