我有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中的函数栏()?
UPD
First List包含对象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();
}
}
答案 0 :(得分: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();
}
如果您知道Base
是 L3
,您可以使用static_cast
:
NewA newA;
Base* base = &newA;
L3* l3 = static_cast<L3*>(base);
newA.bar();
// base->bar(); // ILLEGAL
l3->bar();