C++ 数组多态性

C++ 数组多态性,c++,polymorphism,C++,Polymorphism,我会尽快解释这个问题。 我有这样一个基类: class ArrayEntry { } class BaseClass { ArrayEntry[] m_Array; } ClassA classA = new ClassA(); for (ClassAEntry entry : classA.m_Array) ... 这两个是基类。 在这之后,我有两门课: class ClassA : BaseClass { } class ClassAEntry : ArrayEntry

我会尽快解释这个问题。 我有这样一个基类:

class ArrayEntry
{

}

class BaseClass
{
    ArrayEntry[] m_Array;
}
ClassA classA = new ClassA();
for (ClassAEntry entry : classA.m_Array) 
...
这两个是基类。 在这之后,我有两门课:

class ClassA : BaseClass
{

}

class ClassAEntry : ArrayEntry
{

}
我会用ClassAEntry填充m_数组,但如果我想调用如下内容:

class ArrayEntry
{

}

class BaseClass
{
    ArrayEntry[] m_Array;
}
ClassA classA = new ClassA();
for (ClassAEntry entry : classA.m_Array) 
...
我会得到一个错误。因此,每次我想要访问数组时,我都必须强制转换条目

for (ArrayEntry entry : classA.m_Array)
{
ClassAEntry castedEntry = (ClassAEntry)entry;
..
}
我不想在100个不同的方法上使用强制转换,只是为了能够对每个调用使用一个


有没有更优雅的解决方案?

删除
ArrayEntry[]m_数组
从基类中,添加
ClassAEntry[]m_数组
ClassA
。这通常被称为表达式问题。更简单地说:人们通常希望获得多态性的所有好处(指向集合中基类的指针)以及具体类型的所有好处(了解实际类型,以便执行特定操作)。如果您只需要担心一种类型,那么访问者方法可能很有用。否则,如果您担心两个多态类型的交互,并且需要了解它们的实际类型,那么您应该研究多方法。也就是说,如果基类上的纯虚方法有意义。。。如果
ArrayEntry[]
无法存储
ClassAEntry
,则存储时对象将被切片到
ArrayEntry
。或者你是想存储指针吗?我的蜘蛛侠•感官正在尖叫“Liskov替换原则”违反。@Pajgla是为了避免代码重复——这不是选择动态多态性的原因。删除
ArrayEntry[]m_Array
从基类中,添加
ClassAEntry[]m_数组
ClassA
。这通常被称为表达式问题。更简单地说:人们通常希望获得多态性的所有好处(指向集合中基类的指针)以及具体类型的所有好处(了解实际类型,以便执行特定操作)。如果您只需要担心一种类型,那么访问者方法可能很有用。否则,如果您担心两个多态类型的交互,并且需要了解它们的实际类型,那么您应该研究多方法。也就是说,如果基类上的纯虚方法有意义。。。如果
ArrayEntry[]
无法存储
ClassAEntry
,则存储时对象将被切片到
ArrayEntry
。或者你是想存储指针吗?我的蜘蛛侠•Sense大喊“Liskov替换原则”违反了。@Pajgla是为了避免代码重复——这不是选择动态多态性的原因。