Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1077166
  • 博文数量: 77
  • 博客积分: 821
  • 博客等级: 军士长
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 16:17
个人简介

学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com

文章分类

全部博文(77)

文章存档

2016年(4)

2015年(15)

2014年(16)

2013年(12)

2012年(21)

2011年(9)

分类: C/C++

2012-08-10 10:53:09

    常常会遇到这种情况,当我们有两个类B,C都集成A时,而D又多重继承了B,C,则有可能会出现A的方法被D使用时出现混乱的问题,例如

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6.     A()
  7.     {
  8.     
  9.     }
  10.     void pt()
  11.     {
  12.         flag = 1;
  13.         cout<<flag<<endl;

  14.     }
  15.     ~A()
  16.     {
  17.     }
  18. private:
  19.     int flag;
  20. };

  21. class B :public A
  22. {
  23. public:
  24.     B()
  25.     {
  26.         pt();
  27.     }
  28.     ~B()
  29.     {
  30.     }
  31. };

  32. class C : public A
  33. {
  34. public:
  35.     C()
  36.     {
  37.         pt();
  38.     }
  39.     ~C()
  40.     {
  41.     }
  42. };

  43. class D : public C,public B
  44. {
  45. public:
  46.     D()
  47.     {
  48.         pt();
  49.     }
  50.     ~D()
  51.     {
  52.     }
  53. };

  54. int main()
  55. {
  56.     D d;
  57.     return 0;
  58. }
程序编译时显示
test.cpp: In constructor ‘D::D()’:
test.cpp:52:3: error: reference to ‘pt’ is ambiguous
test.cpp:10:7: error: candidates are: void A::pt()
test.cpp:10:7: error:                 void A::pt()
很明显,出现了冲突,编译器不知要是使用哪个类的方法,解决这个问题的核心思想是让所有直接或间接继承A的类能够共享A的方法,这时虚继承的好处就体现出来了,在B,C采用对A的续继承,代码如下

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6.     A()
  7.     {
  8.     
  9.     }
  10.     void pt()
  11.     {
  12.         flag = 1;
  13.         cout<<flag<<endl;

  14.     }
  15.     ~A()
  16.     {
  17.     }
  18. private:
  19.     int flag;
  20. };

  21. class B :public virtual A
  22. {
  23. public:
  24.     B()
  25.     {
  26.         pt();
  27.     }
  28.     ~B()
  29.     {
  30.     }
  31. };

  32. class C : public virtual A
  33. {
  34. public:
  35.     C()
  36.     {
  37.         pt();
  38.     }
  39.     ~C()
  40.     {
  41.     }
  42. };

  43. class D : public C,public B
  44. {
  45. public:
  46.     D()
  47.     {
  48.         pt();
  49.     }
  50.     ~D()
  51.     {
  52.     }
  53. };

  54. int main()
  55. {
  56.     D d;
  57.     return 0;
  58. }
这样,对于A的方法pt在内存空间中就只有一份拷贝,这样,D对pt方法的调用就不会引发混路
阅读(3358) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~