虚拟继承解决菱形继承带来的二义性问题的过程详析

 二义性问题请详细看:

http://blog.csdn.net/lxp_mujinhuakai/article/details/69414277
解决上篇文章的问题看一下以下代码:

#include<iostream>
using namespace std;

class Grandam
{
public:
     void introduce_self()
    {
        cout << "I am grandam." << endl;
    }
};

class Mother :virtual public Grandam
{
public:
    void introduce_self()
    {
        cout << "I am mother." << endl;
    }
};

class Aunt :virtual public Grandam
{
public:
    void introduce_self()
    {
        cout << "I am aunt." << endl;
    }
};

class Daughter :public Mother,public Aunt
{
public:
    void introduce_self()
    {
        cout << "I am daughter." << endl;
    }
};

int main()
{
    Grandam* ptr;
    Daughter d;
    ptr = &d;
    ptr->introduce_self();
    return 0;
}

结果如下图所示:

这里写图片描述
我们可以查看对象的内存,来知道内存里存放的具体数字:

,在ptr=&d处打断点,在程序运行到此处时,在内存窗口中打印&d,这样就可查看对象d的内存*,如图所示:*
这里写图片描述

内存的首地址中存储了一个地址,我们在内存中输入这个地址0x00eadc98,再次查看这个地址存放的是什么,如图所示:

这里写图片描述

可以看出前两行的第一行存放的是基类对象基于基类的偏移量,为0。而第二行存放的是该派生类对象d基于基类的偏移量8。下面就总结处虚拟继承的具体实现过程。


对象怎么知道调用的是哪个成员,具体过程如下:
1. 指针或引用知道你调用了哪个对象;
2. 对象可以得到存放基于基类的偏移量的地址;
3. 通过该地址获得基于基类的偏移量;
4. 从而基类对象的this指针加上该偏移量,便可以区分调用的是哪个派生类对象的哪个成员。

注意:
1. 加上关键字virtual后,便会为该派生类对象多开辟4个字节出来,存放基于基类的偏移量的地址(即第2步出现的)。
2. 加上关键字virtual后,该菱形继承的大小只多了4个字节,而不是8个。因为基类的成员只开辟了一个空间。
3.解决二义性问题必须在两个派生类第一次继承基类时的位置的继承方式前加上关键词virtual。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,@RequestBody和@RequestParam是用于处理HTTP请求参数的注解。它们之间有一些区别,下面详细解析一下: 1. @RequestBody注解用于获取请求体中的参数,并将其绑定到方法的参数上。通常用于处理POST请求中的表单数据或者JSON数据。当使用@RequestBody注解时,Spring框架会自动将请求体中的数据转换为方法参数所需的对象。例如: ```java @PostMapping("/user") public void addUser(@RequestBody User user) { // 处理user对象 } ``` 在上面的例子中,@RequestBody注解将请求体中的数据转换为User对象,并将其绑定到addUser方法的参数上。 2. @RequestParam注解用于获取URL中的请求参数,并将其绑定到方法的参数上。通常用于处理GET请求或者POST请求中的URL参数。当使用@RequestParam注解时,Spring框架会自动从URL中提取指定名称的参数,并将其转换为方法参数所需的类型。例如: ```java @GetMapping("/user") public void getUser(@RequestParam("id") int userId) { // 处理userId参数 } ``` 在上面的例子中,@RequestParam注解将URL中名为"id"的参数提取出来,并将其转换为int类型,并将其绑定到getUser方法的参数userId上。 总结起来,@RequestBody注解用于获取请求体中的参数,适用于处理POST请求中的表单数据或者JSON数据。而@RequestParam注解用于获取URL中的请求参数,适用于处理GET请求或者POST请求中的URL参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值