菱形虚拟继承&虚函数表&对象模型

菱形继承:

Assitant的菱形继承对象模型

Assitant中有两份Person成员,存在二义性和数据冗余。

所以我们引出了虚拟继承。

virtual虚继.不会在子类中创建父类成员,但是子类中可以引用,就像指针一样。主要用在菱形继承,也叫钻石继承。

虚拟继承对象模型

class Student : vitrual public Person
class Teacher : virtual public Peraon

虚函数表

通过一块连续内存来存储虚函数的地址。这张表解决了继承、虚函数(重写)的
问题。在有虚函数的对象实例中都存在一张虚函数表,虚函数表就像一张地图,指明了实
际应该调用的虚函数。

举例:

typedef  void(*PFUN)();
void PrintVT(int p)//打印虚函数表的信息
{
	PFUN pfun = NULL;
	int *ptr = (int *)p;
	cout << "虚表地址->" << ptr << endl;
	int i = 0;
	while (ptr[i])
	{
		pfun = (PFUN)ptr[i];
		cout << "第" << i << "个虚函数地址-》 " << pfun<<"----";
		pfun();
		i++;
	}
}
class B
{
public:
	virtual void fun1()
	{
		cout << "B::fun1()" << endl;
	}
	virtual void fun2()
	{
		cout << "B::fun2()" << endl;
	}

private:
	int _b;
};

class D :public B
{
public:
	virtual void fun1()
	{
		cout << "D::fun1()" << endl;
	}
	virtual void fun3()
	{
		cout << "D::fun3()" << endl;
	}
	virtual void fun4()
	{
		cout << "D::fun4()" << endl;
	}
private:
	int _d;
};

int main()
{
	D d;
	B b;
	PrintVT(*(int *)&d);
	cout << endl;
	PrintVT(*(int *)&b);
	getchar();
	return 0;
}

其结果如下:

这就是我们所说的虚函数。因为在D里重写的B::fun1();所以D中的fun1()就被覆盖了。小伙伴们懂了吗?

菱形虚拟继承&虚函数表&对象模型

时间: 2024-10-22 01:32:25

菱形虚拟继承&虚函数表&对象模型的相关文章

C++中虚拟继承 &amp; 虚函数表内存分布情况

一 虚继承 1) 代码: Code #include <iostream> using namespace std; class B { public: int i; virtual void vB(){ cout << "B::vB" << endl; } void fB(){ cout << "B::fB" << endl;} }; class D1 : virtual public B { publi

深入C++对象模型&虚函数表

多态的实现机制: C++中虚函数的主要作用就是用来实现多态,就是使用基类的指针或者引用调用重写的虚函数,当父类的指针或引用指向父类对象时调用的是父类虚函数,当指向子类对象时调用的是子类的虚函数.那么这又是怎么实现的呢??? 这都是通过虚函数表实现的,虚函数表是通过一块连续内存来存储虚函数的地址.这张表解决了虚函数重写(地址进行覆盖)的问题 .在有虚函数的对象实例中都有一张虚函数表,虚函数表就像一张地图,指明了实际调用的虚函数函数. 例: class Base { public:        B

解析虚函数表和虚继承

之前大二在学C++的时候一直对虚函数和虚继承有些晕(其实好像就是对virtual这个关键字不太熟悉)现在又学习到了一些,对虚函数表和虚继承的机制有了一点更深入的了解. 关于虚函数以及虚继承的基础知识,我自己也总结了一下,点击浅谈C++多态和C++继承可查看,在继承的总结的时候,我没有总结关于虚继承的知识,而且在多态总结也没有设计到太多的虚函数的知识,我是想把这两块集中在一起讲下,也算是自己对virtual关键字有个比较深入的了解吧.(本文所有代码均在VS2013编译器win32下测试) 另外对于

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr)、C++对象模型

C++ Primer 学习笔记_35_面向对象编程(6)--虚函数与多态(三):虚函数表指针(vptr)及虚基类表指针(bptr).C++对象模型 一.虚函数表指针(vptr)及虚基类表指针(bptr) C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括: virtual function机制:用以支持一个有效率的"执行期绑定": virtual base class:用以实现多次在继承体系中的基类,有一个单一而被共享的实体. 1.虚函数表指针 C++中,有两种数据

单继承与多继承中的虚函数表和虚函数指针

首先,我们了解一下何为单继承,何为多继承?? 单继承:一个子类只有一个直接父类. 多继承:一个子类有两个或多个直接父类. 单继承中的虚函数表分析: 示例程序: #include <iostream> using namespace std; typedef void(*FUNC)(); class Base { public: virtual void func1() { cout << "Base::func1()" << endl; } virt

C++多态篇3——虚函数表详解之多继承、虚函数表的打印

在上上一篇C++多态篇1一静态联编,动态联编.虚函数与虚函数表vtable中,我最后简单了剖析了一下虚函数表以及vptr. 而在上一篇文章C++多态篇2--虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏中我详细介绍了虚函数的函数重载,函数覆盖以及函数隐藏的问题,其实在那一篇文章中,对单继承的虚函数已经做了十分详细的解答了,如果对前面有兴趣的人可以先看一下那篇文章. 在这一篇中,我会具体的分析一下在不同继承中(单继承,多继承)关于虚函数表在内存中的布局以及如何打印虚函数表.但是有关在虚继承

c++ 继承类强制转换时的虚函数表工作原理

本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace std; class Base { public: virtual void f() { cout<<"Base::f()"<<endl; } }; class child1:public Base { public: virtual void f() { cout&l

C++ 虚函数表解析 继承

C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有"多种形态",这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述

C++ 虚函数表与多态 —— 使用继承 &amp; 多重继承的虚函数表

1. 使用继承的虚函数表: 每个类只有1个虚函数表,当子类继承父类后,子类可以自己改写和新增虚函数,如下图所示: 子类重写 func_1 后,子函数的 func_1 将会有新的逻辑,不会干扰到父类: 子类新增行的 func_4 方法后,父类无法访问到该方法. 如下代码: 1 #include <iostream> 2 using namespace std; 3 4 class Father 5 { 6 public: 7 virtual void func_1() { cout <&l