C :从一个基础到另一个基类模板的动态铸造
C++: Dynamic cast from one base to other base class template
给定以下类结构,我想从struct B
中的方法中调用struct C<O>
中的方法。C<O>
遵循奇怪的重复模板模式。我想在不放置struct O
中使用方法的情况下执行此操作。将方法放在struct O
中会破坏struct C<>
的目的。我怀疑这是不可能的,但我想我会问。
编辑: struct O
可以是将struct B
和struct C<O>
作为基础类的一组类型中的任何一种。
struct B
{
virtual void foo ()
{
// dynamic_cast this to C<O>* and call C<O>::moo()
}
};
template <typename P>
struct C
{
virtual void moo () { }
};
struct O :
public B,
public C<O>
{
};
如果在O的定义之后定义了foo键,则可以正常工作:
struct B
{
virtual void foo();
};
template <typename P>
struct C
{
virtual void moo() {}
};
struct O :
public B,
public C<O>
{
};
void B::foo()
{
dynamic_cast<C<O>*>(this)->moo();
}
,所以我建议将CRTP除去并直接从B中铸造为B。或者以少数使C
成为非template类,并从中衍生出CRTP。这样的多个O
类中的多个都不重要。
struct C
{
virtual void moo () {}
};
struct B
{
virtual void foo ()
{
auto p_c{dynamic_cast<C *>(this)};
if(p_c)
{
p_c->moo();
}
}
};
struct O: public B, public C
{
};
int main()
{
O o;
o.foo();
}
相关文章:
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- C++多态性:如何测试一个类是否派生自另一个基类
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 将函数上调整到基类参数的另一个
- 如何从另一个类的基类访问派生类中的受保护成员
- 为什么CRTP(奇怪的递归模板模式)试图选择另一个私有基类的另一个同名函数
- 为什么将好奇模板模式的基类直接转换为另一个基类是错误的?
- 从基类(车辆)继承方法,从派生类(汽车)继承值,以使用 C++ 在另一个派生类(车道)中实现
- C :从一个基础到另一个基类模板的动态铸造
- 从抽象基类访问另一个基类成员
- 为什么当我有两个函数时编译器没有显示错误,一个将采用基类,一个将派生类作为参数
- 通知一个类另一个类的更改
- C++是否有任何方法可以将一组派生类存储在基类的一个向量中,并仍然访问它们的成员
- C++,为什么基类需要一个VTable
- 如何让一组不同的子类对象从另一组共享基类的一个静态变量
- 从static中派生的基类实现一个虚拟方法
- 如果你的基类有一个虚拟析构函数,你自己的析构函数就会自动变成虚拟的
- c++中的接口:为什么我需要一个接口类+另一个父类
- 一个基类只有一个派生类是可以的吗?