调用具有多重继承的已添加类的成员
Calling member of added classes with multiple inheritance
我有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();
}
如果您知道Base
是L3
您可以使用static_cast
:
NewA newA;
Base* base = &newA;
L3* l3 = static_cast<L3*>(base);
newA.bar();
// base->bar(); // ILLEGAL
l3->bar();
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 将私有数据成员添加到野牛生成的类中
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 如何添加依赖于类本身的模板成员变量
- '将成员函数仅添加到类的专用模板
- 如何将任何值转换为对象并使用 boost::p roperty_tree json 添加成员
- 如何为内置类型添加成员功能,例如C 中的整数
- 基于模板参数添加成员函数和成员变量
- 如何使用std::bind向信使系统添加成员回调
- 是否为模板类的某些模板参数添加成员
- 添加成员的声明会导致其隐式初始化
- 具有宏添加成员和影响构造函数
- 如何在添加成员时维护结构的初始化
- 向绑定到Lua的c++类添加成员函数
- 添加成员提升::p tr_vector<>
- 在实现文件中添加成员函数
- 在大解决方案中向类添加成员时发生堆栈溢出错误
- 为第三个库类型添加成员字段