澳门博彩官网

 更新时间:2018年05月15日 10:30:25   作者:止语---   我要评论

这篇文章主要介绍了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++程序设计有所帮助。

相关文章

  • C语言中sizeof函数的基本使用总结

    C语言中sizeof函数的基本使用总结

    这篇文章主要给大家介绍了关于C语言中sizeof函数的基本使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • 红黑树的使用详解

    红黑树的使用详解

    本篇文章是对红黑树的使用详解。需要的朋友参考下
    2013-05-05
  • c语言多进程tcp澳门博彩官网示例

    c语言多进程tcp澳门博彩官网示例

    这篇文章主要介绍了c语言多进程tcp澳门博彩官网示例,多进程socket,epoll实现IO复用,需要的朋友可以参考下
    2014-03-03
  • C++函数参数取默认值的深入详解

    C++函数参数取默认值的深入详解

    本篇文章是对C++中函数参数取默认值进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言中联合体union的实例详解

    这篇文章主要介绍了 C语言中联合体union的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C语言实现C++继承和多态的代码分享

    C语言实现C++继承和多态的代码分享

    本文主要给大家简单讲诉了C和C++的区别以及如何使用C语言模拟实现C++继承和多态,并附上示例代码,是篇相当不错的文章,推荐给喜欢C语言的小伙伴们
    2017-07-07
  • C++数据结构之实现循环顺序队列

    C++数据结构之实现循环顺序队列

    这篇文章主要介绍了 C++数据结构之实现循环顺序队列的相关资料,需要的朋友可以参考下
    2017-01-01
  • C/C++中extern

    C/C++中extern "C" 的作用分析

    这篇文章主要介绍了C/C++中extern "C" 的作用,是在进行C/C++程序设计中非常常见的用法,需要的朋友可以参考下
    2014-09-09
  • WIN32程序获取父进程ID的方法

    WIN32程序获取父进程ID的方法

    这篇文章主要介绍了WIN32程序获取父进程ID的方法,在进行windows程序开发的时候有一定的实用价值,需要的朋友可以参考下
    2014-08-08
  • OpenCV实现马赛克功能

    OpenCV实现马赛克功能

    这篇文章主要为大家详细介绍了OpenCV实现马赛克功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论