C++多重继承引发的重复调用问题与解决方法
时间:2019-04-15
本文章向大家介绍C++多重继承引发的重复调用问题与解决方法,主要包括C++多重继承引发的重复调用问题与解决方法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例讲述了C++多重继承引发的重复调用问题与解决方法。分享给大家供大家参考,具体如下:
前面简单介绍了一个C++多重继承功能示例,这里再来分析一个多重继承引发的重复调用问题,先来看看问题代码:
#include "stdafx.h" #include<stdlib.h> #include<iostream> using namespace std; class R//祖先类 { private: int r; public: R(int x = 0):r(x){} void f() { cout << " r = " << r << endl; } void print() { cout << "print R = " << r << endl; } }; //虚继承 class A : virtual public R { private: int a; public: A(int x,int y):R(x),a(y){} //重写父类的f()函数 void f() { cout << "a = " << a << endl; R::f();//r是私有成员变量,不能直接访问,通过作用域进行访问被派生类覆盖的函数f() } }; //虚继承 class B : virtual public R { private: int b; public: B(int x, int y) :R(x), b(y) {} //重写父类的f()函数 void f() { cout << "b = " << b << endl; R::f();//r是私有成员变量,不能直接访问,通过作用域进行访问被派生类覆盖的函数f() } }; class C :public A, public B { private: int c; public: C(int x,int y,int z,int m):R(x),A(x,y),B(x,z),c(m) { } void f() { cout << "c = " << c << endl; A::f();//此时A里面有一个 r 的输出,和输出a B::f();//B里面也有一个r的输出,和输出b //从而导致重复调用,两次输出 r } }; int main() { C cc(1212, 345, 123, 45); cc.f(); system("pause"); return 0; }
解决办法:针对重复调用,每个类把属于自己的工作单独封装
修改后的代码如下:
#include "stdafx.h" #include<stdlib.h> #include<iostream> using namespace std; class R//祖先类 { private: int r; public: R(int x = 0):r(x){} void f() { cout << " r = " << r << endl; } virtual void print() { cout << "print R = " << r << endl;} }; //虚继承 class A : virtual public R//virtual写在public的前后均可以 { private: int a; public: A(int x,int y):R(x),a(y){ } protected: void fA()//增加一个保护函数,只打印自己的扩展成员 { cout << "a = " << a << endl; } void f()//重写父类的f()函数 { //cout << "a = " << a << endl; fA(); R::f();//r是私有成员变量,不能直接访问,通过作用域进行访问被派生类覆盖的函数f() } }; //虚继承 class B : virtual public R { private: int b; public: B(int x, int y) :R(x), b(y) {} protected: void fB()//增加一个保护函数,只打印自己的扩展成员 { cout << "b = " << b << endl; } void f()//重写父类的f()函数 { fB(); R::f();//r是私有成员变量,不能直接访问,通过作用域进行访问被派生类覆盖的函数f() } }; class C :public A, public B { private: int c; public: C(int x,int y,int z,int m):R(x),A(x,y),B(x,z),c(m) { } void f() { cout << "c = " << c << endl; R::f(); //A::f();//此时A里面有一个 r 的输出,和输出a //B::f();//B里面也有一个r的输出,和输出b //从而导致重复调用,两次输出 r fA();//A::fA(); fB();//A::fB(); } }; int main() { C cc(1212, 345, 123, 45); cc.f(); system("pause"); return 0; }
希望本文所述对大家C++程序设计有所帮助。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java中的时间日期API知识点总结
- ubuntu中终端命令提示符太长的修改方法汇总
- Python贪心算法实例小结
- Vim中文件编码处理与重新打开乱码文件详解
- 关于Angularjs中自定义指令一些有价值的细节和技巧小结
- Python3使用正则表达式爬取内涵段子示例
- Vue下滚动到页面底部无限加载数据的示例代码
- Ubuntu 16.04 LTS系统里中文txt文件打开的问题解决
- Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
- 使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
- Python数据结构之哈夫曼树定义与使用方法示例
- JS实现的哈夫曼编码示例【原始版与修改版】
- 基于C++实现的哈夫曼编码解码操作示例
- vue-cli3.0 特性解读
- 用Vue写一个分页器的示例代码