调用具有多重继承的已添加类的成员

Calling member of added classes with multiple inheritance

本文关键字:添加 成员 调用 多重继承      更新时间:2023-10-16

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

如何在列表中调用函数栏()?

UPD

第一个列表包含对象 A 和 B,但现在有 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();
    }
}

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

如果您知道BaseL3您可以使用static_cast

NewA newA;
Base* base = &newA;
L3* l3 = static_cast<L3*>(base);
newA.bar();
// base->bar(); // ILLEGAL
l3->bar();