新手请教大神:关于多重继承,虚函数在虚表中地址方面的问题

boot_black boot_black 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
先贴上代码,很简单的一个基类和继承类。
#include <iostream>

class Base1
{
public:
virtual void f() { std::cout << "Base::f()" << std::endl; }
virtual void g() { std::cout << "Base::g()" << std::endl; }
virtual void h() { std::cout << "Base::h()" << std::endl; }
};

class Base2
{
public:
virtual void f() { std::cout << "Base::f()" << std::endl; }
virtual void g() { std::cout << "Base::g()" << std::endl; }
virtual void h() { std::cout << "Base::h()" << std::endl; }
};

class Base3
{
public:
virtual void f() { std::cout << "Base::f()" << std::endl; }
virtual void g() { std::cout << "Base::g()" << std::endl; }
virtual void h() { std::cout << "Base::h()" << std::endl; }
};

class Derive : public Base1, public Base2, public Base3
{
public:
virtual void f1() { std::cout << "Derive::f1()" << std::endl; }
virtual void g1() { std::cout << "Derive::g1()" << std::endl; }
virtual void h1() { std::cout << "Derive::h1()" << std::endl; }
};




按照我的理解(如下):
内存1窗口有6个函数地址,分别对应f(),g(),h(),f1(),g1(),h1()。
内存2窗口有3个函数地址,分别对应f(),g(),h()。
内存3窗口有3个函数地址,分别对应f(),g(),h()。
为什么内存2,派生类d继承的基类Base2中有5个函数地址(前面三个是正确的,最后2个地址代表什么?),恳请指教。谢谢哈。
...全文

相关推荐

虚函数虚表的详解,大家看看!

个类如果有虚函数,不管是几个虚函数,都会为这个类声明一个虚函数表,这个虚表是一个含有虚函数的类的,不是说是类对象的。一个含有虚函数的类,不管有多少个数据成员,每个数据成员都有一个虚指针,在内存中,存放每个类对象的内存区,在内存区的头部都是先存放这个指针变量的,从第5个字节才是这个对象自己的东西。

miaohongwei

c++中超级详细的一些知识,新手快来

这篇文章主要来讨论C++对象在内存中的布局,属于第二个概念的研究范畴。而C++直接支持面向对象程序设计部分则不多讲。虚函数表解析。含有虚函数或其父类含有虚函数的类,编译器都会为其添加一个虚函数表,vptr,先了解虚函数表的构成,有助对C++对象模型的理解。虚基类表解析。虚继承产生虚基类表(vbptr),虚基类表的内容与虚函数表完全不同,我们将在讲解虚继承时介绍虚函数表。对象模型概述:介绍简单对象模型、表格驱动对象模型,以及非继承情况下的C++对象模型。继承下的C++对象模型。

阿玥的小东东

(转)多重继承下的虚函数表

多态是C++语言中的一项重要的机制,虚函数就是为实现多态而设计的。多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”。而虚函数表在这种多态机制中起了核心调度的作用。由于是编译器在后台操作,所以它被蒙上了一层神秘的面纱。 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为VFTable。 在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,VFTable就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。在C++的标准中提到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置。 这意味着我们通过对象实例的地址得到它的VFTable,然后就可以遍历其中函数指针,并调用相应的函数。

smallnang

虚函数和虚继承及其在内存中布局

该资源为虚函数和虚继承及其结合的内存布局的测试,文中写明了有详细测试结果。

fantasywm

C++多重继承二义性原理实例解析

在派生类中对基类成员访问应该是唯一的,但是在多继承时,可能会导致对基类某成员访问出现不一致的情况,这就是C++多继承中的二义性。 有两种继承的情况会产生多义性 一、如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的成员变量进行访问时,可能产生二义性,继承关系如下图所示: #include <iostream> using namespace std; class A{ public: int a; }; class B1 : public A{ public: int b1; }; class B2 : public A{ public: int

weixin_38687218
评论 5
收藏 已收藏
分享
返回顶部
boot_black
C++ 语言 65,214 成员 250,514 内容