概述
关于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++多继承成员函数名冲突的解决方案及调用实质比较源代码源码分析目标码对比分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复