2014-01-08 47 views
0

的構件我有4類:調用添加的類多重繼承

  • 列表
  • 基地

我需要添加其延伸的一個類A和B級的工作 - L3。 NewA和NewB類實現L3中聲明的函數。

class Base 
{ 
    virtual void foo() = 0; 
} 

class A: virtual public Base 
{ 
    void foo(); 
} 
class B: virtual public Base 
{ 
    void foo(); 
} 

class L3: virtual public Base 
{ 
    virtual void bar() = 0; 
} 
class NewA: public A, virtual public L3 
{ 
    void bar(); 
} 

class NewB: public B, virtual public L3 
{ 
    void bar(); 
} 

如何在List中調用函數bar()?

UPD

第一個列表包含對象A和B,但現在有紐瓦和福利局

class List 
{ 
    public: 
     void append(Base *sh); 
     void next(); 
     void setBegin(); 
     Base* curr(); 
     void out(std::ofstream &ofst); 

    protected: 
     std::list <Base*> container; 
     std::list <Base*>::iterator iter; 
} 

void List:: next() 
{ 
    iter++; 
} 

void List:: setBegin() 
{ 
    iter = container.begin(); 
} 

void List:: append(Base* sh) 
{ 
    container.push_back(sh); 
} 

Base* List::curr() 
{ 
    return *iter; 
} 

void List::out(ofstream &ofst) 
{ 
    setBegin(); 
    for (int i=0; i<container.size(); i++) 
    { 
     cout<<"Out: "<< endl; // I need to call bar() at this line 
     next(); 
    } 
} 
+0

你沒有表現出類'List' 。這使你的問題有點難以回答。 –

回答

1

Base沒有辦法bar(),只有L3(及其派生類)有。 所以你不能從Base撥打電話bar()

你可以做到以下幾點:

Base* base = List.curr(); 
L3* l3 = dynamic_cast<L3*>(base); // l3 is non null if base is non null and IS a L3. 

if (l3 != nullptr) { 
    // base->bar(); // ILLEGAL 
    l3->bar(); 
} 

在這種情況下,你知道BaseIS一個L3您可以使用static_cast

NewA newA; 
Base* base = &newA; 
L3* l3 = static_cast<L3*>(base); 

newA.bar(); 
// base->bar(); // ILLEGAL 
l3->bar();