| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2149 人关注过本帖
标题:多继承中的二义性问题
取消只看楼主 加入收藏
jfckpep
Rank: 1
等 级:新手上路
帖 子:40
专家分:2
注 册:2010-4-25
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
多继承中的二义性问题
using namespace std;
class Base
{
public:
    Base(int i):b(i) {cout<<"Base constructor. b="<<i<<endl;}
    ~Base(){cout<<"Base destructor. b="<<b<<endl;}
    int GetB(){return b;}
private:
    int b;
};

class Base11:virtual public Base
{
public:
    Base11(int i,int j):Base(i),b11(j)
    {
        cout<<"Base11 constructor."<<endl;
    }
    ~Base11(){cout<<"Base11 destructor."<<endl;}
    void Print()
    {
        cout<<"Data in Base11. b11="<<b11<<",b="<<GetB()<<endl;
    }
private:
    int b11;
};
class Base12:virtual public Base
{
public:
        Base12 (int i,int j):Base(i),b12(j)
    {
        cout<<"Base12 constructor.";
    }
        ~Base12(){cout<<"Base12 destructor."<<endl;}
        void Print()
        {
            cout<<"Data in Base12. b12="<<b12<<",b="<<GetB()<<endl;
        }
private:
    int b12;
};
class Base2:public  Base
{
public :
    Base2(int i,int j):Base(i),b2(j)
    {
        cout<<"Base2 constructor."<<endl;
    }
    ~Base2() {cout<<"Base2 destructor."<<endl;}
    void Print()
    {
        cout<<"Data in Base2. b2="<<b2<<",b="<<GetB()<<endl;
    }
private:
    int b2;
};
class Derived:public Base11,public Base12,public Base2
{
public:
    Derived(int i,int j,int k,int l,int m,int n,int x,int y):Base11(i,j),Base12(k,l),Base2(m,n),Base(x),d(y)
    {
        cout<<"Derived constructor."<<endl;
    }
    ~Derived(){cout<<"Derived destructor."<<endl;}
    int GetD(){return d;}
private:
    int d;
};

int main()
{
    Derived obj(1,2,3,4,5,6,7,8);
    obj.Base11::Print();
    obj.Base12::Print();
    obj.Base2::Print();
    cout<<"Data in itself. d="<<obj.GetD()<<endl;
    return 0;
}

这个程序是我教材里的一个例子,但是我编译时报错,出现了二义性,想了一下,的却是的,而书本却能给出了下面的输出结果,想问是怎么回事?
Base constructor. b=7
Base11 constructor.
Base12 constructor.
Base constructor. b=5
Base2 constructor.
Derived constructor.
Data in Base11. b11=2,b=7
Data in Base12. b12=4,b=7
Data in Base2. b2=6,b=5
Data in itself. d=8
...
搜索更多相关主题的帖子: 继承 void private public return 
2011-07-24 13:49
jfckpep
Rank: 1
等 级:新手上路
帖 子:40
专家分:2
注 册:2010-4-25
收藏
得分:0 
回复 2楼 specilize
不会吧,我用的是vs2008和vs2010,都报错了ambiguous access of 'Base
2011-07-24 21:23
jfckpep
Rank: 1
等 级:新手上路
帖 子:40
专家分:2
注 册:2010-4-25
收藏
得分:0 
回复 2楼 specilize
类Derived从类Base11和Base12继承了成员GetB(),然后又从类Base2继承了GetB(),这不是二义性吗?
2011-07-24 21:28
jfckpep
Rank: 1
等 级:新手上路
帖 子:40
专家分:2
注 册:2010-4-25
收藏
得分:0 
回复 5楼 rjsp
可是它的原意不是这个啊,它题目解释说的Base2不是虚对象
2011-07-25 22:34
jfckpep
Rank: 1
等 级:新手上路
帖 子:40
专家分:2
注 册:2010-4-25
收藏
得分:0 
回复 6楼 specilize
对啊,对GetB()访问时不就会出现二义性吗?
2011-07-25 22:38
jfckpep
Rank: 1
等 级:新手上路
帖 子:40
专家分:2
注 册:2010-4-25
收藏
得分:0 
回复 11楼 xg5699
谁都知道改为class Base2:virtual public Base就可以通过了啊,只是这样改了就跟他题目想说的不一样了,另一个问题是没改前再VC6.0一样能编译通过
2011-07-31 11:05
快速回复:多继承中的二义性问题
数据加载中...
 
   



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

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