2013-04-02 57 views
0

我有一个基类Number。类别OneTwo源自Number。 现在我定义另一个类Three,在这里我需要从多重继承访问单个基类:访问从两个相同的基类派生的派生类的个别类


class Number{ 
    protected: 
    int val; 
    public: 
    Number(){ 
     val=0; 
    } 
    void Add(Number n){//Receives another Number class instance and add the value 
     val+=n.val; 
    } 
}; 

//class One derived from Number 
class One:public Number{ 
    public: 
    One(){ 
      cal=1; 
    } 
}; 

//class two derived from Number 
class Two:public Number{ 
    public: 
    Two(){ 
      val=2; 
    } 
}; 

class Three:public One,public Two{ 
    public: 
    Three(){ 
      Two::Add(One);//--How can i pass instance of class One Here 
    } 
}; 

我试过一次::数与数::,但没有用。

+0

'添加(一个)','一个'不是你的类的实例,而是类型本身。你需要一个'One'类型的变量。 –

回答

-1

这应该工作:

Two::Add(*(One*)this); 
+0

作品像一个魅力:) – HariHaraSudhan

+1

我最初发布了一个提示类型转换作为评论,但你必须认识到,当你解决这个问题时,你的类设计仍然存在严重的问题。 – dyp

+0

@DyP有基本类继承两次的合法用例。这显然是一个简化的例子,不可能分辨出真正的设计是否存在“严重问题”。 – Henrik

-1

您需要创建相应类型的对象。

class Three : public One, public Two 
{ 
public: 
    Three() 
    { 
      Add(One()); 
      Add(Two()); 
    } 
}; 

但是我不明白为什么你需要MI在这里。从数字继承就足够了。

+0

我编辑了这个问题,我需要使用一个或两个添加功能来添加另一个。 – HariHaraSudhan

0

有几个问题,首先val是私人的,所以需要制作protected。接下来你有一个diamond of death所以你需要virtual publicOneTwo。您也尝试使用type调用Add,但你需要在每个类的instance

class Number{ 
protected: 
    int val; 
public: 
    Number(){ 
     val=0; 
    } 
    void Add(Number& n){//Receives another Number class instance and add the value 
     val+=n.val; 
    } 
}; 

//class One derived from Number 
class One:virtual public Number{ 
public: 
    One(){ 
      val=1; 
    } 
}; 

//class two derived from Number 
class Two:virtual public Number{ 
public: 
    Two(){ 
      val=2; 
    } 
}; 

class Three: public One, public Two{ 
public: 
    Three() 
    { 
      Two t1 ; 
      Add(t1);//--How can i pass instance of class Two Here 
    } 
}; 

可以这样说,使用protected数据是错的,但它取决于on your case但要完成这也是一个选择保持val一个private数据成员并使用protected constructor这将是这样的:

class Number{ 
private: 
    int val; 
protected: 
    Number(int n) : val(n) {} 
public: 
    Number(){ 
     val=0; 
    } 
    void Add(Number& n){//Receives another Number class instance and add the value 
     val+=n.val; 
    } 
}; 

class One: virtual public Number{ 
public: 
    One() : Number(1) { 

    } 
}; 

class Two: virtual public Number{ 
public: 
    Two() : Number(2) { 
    } 
}; 
+0

我不会让'val'保护它的唯一目的是将其设置在ctor中。你也可以创建一个受保护的'Number :: Number(int)'。 – dyp

+1

@DyP我相信这取决于您的使用案例,但我修改了我的答案,以涵盖两者以及相关问题。 –

-1

问题不仅仅是语法。但是你究竟想要做什么?

您可以。但是One的实例在哪里申明?你必须先申报。记住Two::Add(One);不是一个声明而是一个调用语句。

,你在做什么,就相当于让我们说

process_number(One); 

如果进程号是一个函数。