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

C++对象模型

时间:2016-05-10 18:53:00      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:opinion   程序设计   public   虚函数   多态性   

什么是C++对象模型?


引用《深度探索C++对象模型》中的两个概念:

  1. 语言中直接支持面向对象程序设计的部分

  2. 对各种支持的底层实现机制

In my opinion 对象模型是对象在存储空间上的空间比时间更优,并对C++面向对象的技术加以支持,如虚指针虚表指针支持多态性。什么是多态?

●多态

C++中虚函数的作用主要是为了实现多态机制。多态,是指在继承层次中,父类的指针可以具有多种形态——当他指向某个子类对象时,通过它能调用到子类的函数,而非父类的函数。简单滴讲,当使用基类的指针或引用重写的虚函数时,当使用父类调用的就是父类的虚函数,指向子类就是子类的虚函数。

#include<iostream>
using namespace std;
class Person
{
public:
    virtual void BuyTicket()
    {
        cout<<"买票"<<endl;
    }
};
class Student
{
public:
    virtual void BuyTicket()
    {
        cout<<"买票半价"<<endl;
    }
};
void Fun(Person& P)
{
    P.BuyTicket();
}
void Test()
{
    Person P;
    Student S;
    Fun(P);
    Fun(S);
}

虚函数表解析

含有虚函数或其父类含有虚函数的类,编译器都会为其添加一个虚函数表vptr,(先了解虚函数表,有助于C++对象模型的理解)

继承下的C++对象模型。分析C++对象在下面情形中的内存布局:

单继承:子类单一继承自父类,分析了子类重写父类函数,子类定义了新的虚函数情况下子类对象的内存布局。

多继承:子类继承于多个父类,分析了子类重写父类函数,子类定义了新的虚函数情况下子类对象的内存布局,同时分析了虚继承下的菱形继承。

虚继承:分析了单一继承体系下的虚继承、多重基层下的虚继承、重复继承下的虚继承。

●虚表

class Base
{
public:
    Base(int i)
        :basel(i)
    {}
    vitual void print(void)
    {
        cout<<"调用了虚函数的Base::Print()";
    }
    virtual stel()
    {
        cout<<"调用了虚函数的Base::stel()";
    }
    virtual ~Base()
    {}
private:
    int basel
};

 技术分享

当一个类本身定义了虚函数,或其父类有虚函数时,为了支持多态机制,编译器将为该类添加一个虚函数表指针,虚函数指针一般都放在对象内存布局的第一个位置上,这是因为保证在多层继承或多重继承下能最高效率地取到虚函数表。



C++对象模型

标签:opinion   程序设计   public   虚函数   多态性   

原文地址:http://10798301.blog.51cto.com/10788301/1771903

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