我是靠谱客的博主 积极鞋垫,最近开发中收集的这篇文章主要介绍关于c++多继承成员函数名冲突的解决方案及调用实质比较源代码源码分析目标码对比分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

关于c++多继承成员函数名冲突的解决方案及调用实质比较

  • 源代码
  • 源码分析
  • 目标码
  • 对比分析
    • 1、 ==类型转换确定超类方法==
    • 2、==子类确定类成员方法==
    • 3、==对比结果==

源代码

#include <iostream>

using namespace std;
class Dog
{
        public:
                virtual void bark() { cout << "Woof!" << endl; }
                virtual void eat() { cout << "The dog has eaten." << endl; }
};



class Bird
{
        public:
                virtual void chirp() { cout << "Chirp!" << endl; }
                virtual void eat() { cout << "The bird has eaten." << endl; }
};

class DogBird : public Dog, public Bird
{
};



int main(int argc, char** argv)
{
        DogBird myConfusedAnimal;
//      myConfusedAnimal.eat(); // BUG! Ambiguous call to method eat()

        myConfusedAnimal.Dog::eat() ;
        static_cast<Dog>(myConfusedAnimal).eat() ;
}

源码分析

若直接调用myConfusedAnimal.eat(),编译错(“error: request for member ‘eat’ is ambiguous”),用两种方法明确指定具体类成员函数,分别是子类成员函数确定方法和超类确定转换方法。

目标码

34		myConfusedAnimal.Dog::eat() ;
   0x00000000004008b3 <+33>:	lea    -0x20(%rbp),%rax
   0x00000000004008b7 <+37>:	mov    %rax,%rdi
   0x00000000004008ba <+40>:	callq  0x400964 <Dog::eat()>

35	
36		static_cast<Dog>(myConfusedAnimal).eat() ;
   0x00000000004008bf <+45>:	lea    -0x20(%rbp),%rdx
   0x00000000004008c3 <+49>:	lea    -0x8(%rbp),%rax
   0x00000000004008c7 <+53>:	mov    %rdx,%rsi
   0x00000000004008ca <+56>:	mov    %rax,%rdi
   0x00000000004008cd <+59>:	callq  0x4009e8 <Dog::Dog(Dog const&)>
   0x00000000004008d2 <+64>:	lea    -0x8(%rbp),%rax
   0x00000000004008d6 <+68>:	mov    %rax,%rdi
   0x00000000004008d9 <+71>:	callq  0x400964 <Dog::eat()>

对比分析

1、 类型转换确定超类方法

  • 超类内存实例
  • 用超类复制构造函数,复制子类数据
  • 调用成员函数

2、子类确定类成员方法

  • 直接调用成员函数

3、对比结果

从上述目标码对比,可以得出类型转换明确超类方法比子类明确类成员方法要额外多出如下两项:

  • 超类实例化所带来的内存开销
  • 超类复制构造函数

最后

以上就是积极鞋垫为你收集整理的关于c++多继承成员函数名冲突的解决方案及调用实质比较源代码源码分析目标码对比分析的全部内容,希望文章能够帮你解决关于c++多继承成员函数名冲突的解决方案及调用实质比较源代码源码分析目标码对比分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部