2014-01-08 3 views
0

Я имел 4 класса:Вызов член добавляемых классов с множественным наследованием

  • Список
  • Base
  • B

Мне нужно добавить класс, который расширяет работа классов 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(); 
} 

Как я могу вызвать функциональную панель() внутри списка?

UPD

Первый список содержит объекты А и Б, но теперь есть NEWA и NEWB

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 (и его производный класс) имеет. Таким образом, вы не можете позвонить bar() из Base.

Вы можете сделать следующее:

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(); 
} 

В случае, если вы знаете, что BaseISL3 вы можете использовать static_cast:

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

newA.bar(); 
// base->bar(); // ILLEGAL 
l3->bar(); 
Смежные вопросы