cpp——多重继承——对象名字查找
来源:互联网 发布:windows是基于dos吗 编辑:程序博客网 时间:2024/04/29 10:12
多父类继承自不同父类
class CAnimal1{public: void doWork(char) { cout << "CAnimal1::doWork(char)" << endl; } public: char work;};class CAnimal2{public: void doWork(int) { cout << "CAnimal2::doWork(int)" << endl; } public: int work;};class CDonkey : public CAnimal1{public: void doWork(long) { cout << "CDonkey::doWork(long)" << endl; } public: long work;};class CHorse : public CAnimal2{public: void doWork(double) { cout << "CHorse::doWork(double)" << endl; } public: double work;};class CMule : public CDonkey, public CHorse{public: void search() { char cWork = 'a'; int iWork = 3; long lWork = 5L; double dWork = 8.0; //doWork(cWork); //doWork(iWork); //doWork(lWork); //doWork(dWork); //work = cWork; //work = iWork; //work = lWork; //work = dWork; CAnimal1::doWork(cWork); CAnimal2::doWork(iWork); CDonkey::doWork(lWork); CHorse::doWork(dWork); CAnimal1::work = cWork; CAnimal2::work = iWork; CDonkey::work = lWork; CHorse::work = dWork; cout << "CAnimal1::work = " << CAnimal1::work << endl; cout << "CAnimal2::work = " << CAnimal2::work << endl; cout << "CDonkey::work = " << CDonkey::work << endl; cout << "CHorse::work = " << CHorse::work << endl; }};
output:
CAnimal1::doWork(char)CAnimal2::doWork(int)CDonkey::doWork(long)CHorse::doWork(double)CAnimal1::work = aCAnimal2::work = 3CDonkey::work = 5CHorse::work = 8
多重继承类作用域嵌套:
CAnimal1{ CDonkey { CMule { } }}CAnimal2{ CHorse { CMule { } }}
多父类继承自同一父类
class CAnimal{public: void doWork(int) { cout << "CAnimal::doWork(int)" << endl; } public: int work;};class CDonkey : public CAnimal{public: void doWork(long) { cout << "CDonkey::doWork(long)" << endl; } public: long work;};class CHorse : public CAnimal{public: void doWork(double) { cout << "CHorse::doWork(double)" << endl; } public: double work;};class CMule : public CDonkey, public CHorse{public: void search() { int iWork = 3; long lWork = 5L; double dWork = 8.0; //doWork(iWork); //doWork(lWork); //doWork(dWork); //work = iWork; //work = lWork; //work = dWork; //CAnimal::doWork(iWork); CDonkey::doWork(lWork); CHorse::doWork(dWork); //CAnimal::work = iWork; CDonkey::work = lWork; CHorse::work = dWork; cout << "CDonkey::work = " << CDonkey::work << endl; cout << "CHorse::work = " << CHorse::work << endl; }};
output:
CDonkey::doWork(long)CHorse::doWork(double)CDonkey::work = 5CHorse::work = 8
多重继承类作用域嵌套:
CAnimal{ CDonkey { CMule { } }}CAnimal{ CHorse { CMule { } }}
总结
- 子类与父类的类作用域嵌套,子类作用域内嵌于父类作用域,但子类的父类们之间并无继承关系,因此在类作用域上是并行的,无嵌套,CMule类作用域分别内嵌于CDonkey和CHorse类作用域,CDonkey和CHorse类作用域分别内嵌于CAnimal类作用域,但CDonkey和CHorse类作用域并行无嵌套,而且也无先后顺序,在CMule类作用域中查找对象名字时先在CMule类作用域中查找,如果not found,接下来从CDonkey和CHorse类作用域并行查找,CDonkey和CHorse类作用域不是属于同一作用域,因此它们之间重名的函数对象名字不会形成函数重载,因此在并行查找对象名字过程中不同类作用域中的名字不会进行类型匹配精确度比较,如果在多个并行类作用域中分别查到名字就形成二义性错误,编译error
注:为避免二义性错误,解决方法可在子类作用域override,明确引用直接或间接父类作用域内的对象名字
0 0
- cpp——多重继承——对象名字查找
- cpp——类——多重继承——作用域 名字查找
- cpp——类——虚继承——作用域 名字查找
- cpp——类——作用域 名字查找
- Python 面向对象 —— 多重继承
- cpp——多重继承——构造 复制 析构 赋值
- c——名字查找
- 探索多态和多态对象模型—单一继承&多重继承
- cpp——类——多重继承——构造函数 析构函数 赋值操作符函数
- Cpp深入:多重继承
- Cpp--改造多重继承
- c++读书笔记——多重继承
- python学习——多重继承
- C++ 13 —— 多重继承
- 老师—职工的多重继承
- CPP基础知识—关于菱形继承
- 【Python】学习笔记——-8.3、面向对象高级编程:3.多重继承
- 多重继承——菱形继承(二义性)
- Basic Linux Privilege Escalation
- OSGI企业应用开发(七)细说Blueprint & Gemini Blueprint(二)
- 根据Ping(ICMP协议)得到TTL并分析
- Android逆向工程 初篇
- Error: cannot open C:\Users\(用户名)\AppData\Local\Temp\internaljobs.obj.5628.140.jom for write
- cpp——多重继承——对象名字查找
- docker常用命令(二)
- 欢迎使用CSDN-markdown编辑器
- 自建https服务器
- docker常用命令(三)
- weblogic SSL证书错误 FATAL Alert:BAD_CERTIFICATE - A corrupt or unuseable certificat
- 自定义一个枚举类
- 数据库连接池常用参数名称解释
- Android 编程技巧之 ----- 断点续传原理以及实现