标题:新手求解一个多重继承的访问问题
只看楼主
LBY_CHINA
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-7-9
结帖率:0
已结贴  问题点数:20 回复次数:16 
新手求解一个多重继承的访问问题
#include"iostream.h"
class base{
public:
    int lby;
};

class base1:public base{};
class base2:public base{};
class b12:public base1,public base2{};
class b22:public base1,public base2{};
class kk:public b12,public b22{};
//*******************************************************
main()
{
kk bbb;
}
我想通过对象bbb修改bbb.b22.base2.base.lby=1999;怎样写表达式?
搜索更多相关主题的帖子: include public 表达式 
2013-07-09 12:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
你这写的是什么呀,我劝你要么别搞C/C++,要么就换本不那么烂得离谱的书
#include"iostream.h" ------ 第一,不可以用双引号(别听那些半瓶子水的所谓高手);第二,C++中没有这个标准文件(别说恐龙时代有这个文件,恐龙已经灭绝好多年了)
main() ------ 同样,可省略int的旧标准年代也早就过去了。

程序代码:
#include <iostream>
using namespace std;

struct base {
    int lby;
};

struct base1 : base {};
struct base2 : base {};
struct b12   : base1, base2 {};
struct b22   : base1, base2 {};
struct kk    : b12,   b22   {};

int main()
{
    kk bbb;
    bbb.b22::base2::lby = 1999;
    //
    bbb.b22::base2::base::lby = 1999;

    return 0;
}

2013-07-09 13:06
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
得分:0 
#include<iostream>
using namespace std;
 class base{
     int lby;
 public:
   
     base(int x){lby=x;cout<<"lby="<<lby<<endl;}
 };
class base1:virtual public base  //base为虚基类
{
    int a;
public:
    base1(int x,int mm):base(x){a=mm;}
};
 class base2:virtual public base  //base为虚基类
 {
     int b;
 public:
     base2(int x,int z):base(x){b=z;}
 };
 class b12:virtual public base1,virtual public base2
 {
     int c;
 public:
     b12(int x,int mm,int z,int v):base(x),base1(x,mm),base2(x,z){c=v;}
 };
 class b22:virtual public base1,virtual public base2
 {
     int d;
 public:
     b22(int x,int mm,int z,int l):base(x),base1(x,mm),base2(x,z){d=l;}
 };
 class kk: public b12,public b22
 {
 public:
     kk(int x,int mm,int z,int v,int l):base(x),base1(x,mm),base2(x,z),b12(x,mm,z,v),b22(x,mm,z,l){}
   
 };
 //*******************************************************
 int main()
 {
 kk bbb(1999,1,2,3,4);
 return 0;
 }
写得比较仓促,楼主仔细看看就会明白的

思考赐予新生,时间在于定义
2013-07-09 13:19
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
得分:0 
补充说明一下,主要是利用虚基类的知识,注意各个类的构造函数的先后顺序,派生类的构造函数可以在声明时对基类进行初始化,顺序是先基类的构造函数,然后是派生类的构造函数,最后是对基类对象的初始化(如果在派生类中定义了基类对象,则按照这样的顺序)

思考赐予新生,时间在于定义
2013-07-09 13:24
LBY_CHINA
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-7-9
得分:0 
bbb.b22::base2::lby = 1999;
这样的表达式无法通过编译啊!!!!!
2013-07-09 13:34
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
得分:0 
回复 5楼 LBY_CHINA
楼主可以复制我的代码去调试,基本可以实现楼主想要的结果,那些代码我是在
vs2012上亲自调试过了,没问题

思考赐予新生,时间在于定义
2013-07-09 13:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用LBY_CHINA在2013-7-9 13:34:45的发言:

 bbb.b22::base2::lby = 1999;
这样的表达式无法通过编译啊!!!!!

那只能曲线救国了 ((base2&)(b22&)bbb).lby = 1999;
根本原因在于,你这种设计,而非语法,本身是错误的
2013-07-09 13:49
LBY_CHINA
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-7-9
得分:0 
     我想说的意思的是对于多重公用继承,怎样访问任意深度的基类,当然没有同名的很好访问,但对于上面问题同名情况如何表达,我本意不想用虑基类只产生一个拷贝。就相写出形如:bbb.b22.base2.base.lby=1999或bbb.b12.base2.base.lby=2000这样的访问形式,如不能解决则公有继承的公有成员怎样实现任意访问?
2013-07-09 13:49
LBY_CHINA
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-7-9
得分:0 
对不起我用VC6。0调试通不过我没有VC2012
2013-07-09 13:52
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
得分:0 
VC6.0我也调试来,没错啊
下面是VC6.0调试结果的截图:

下面这个为VS2012调试结果的截图:


思考赐予新生,时间在于定义
2013-07-09 14:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-416963-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049581 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved