关于派生类被动态创建时,在基类中修改派生类属性的疑问
//基类
public class Message
{
public void decode(ByteArray data, Message msg)
{
string[][] attrs = msg.getAttributes();
string[] attr;
ByteArray tmpbarr;
int i = 0;
while (i < attrs.Length)
{
attr = attrs[i];
byte type = data.ReadUnsignedByte();
switch (type)
{
//此处是多种数据类型的解析处理,依据派生类中指定的数据结构 省略了其它没有问题的类型
case 13: //此分支为 自定义类型数组形式数据 的解析 解析完成给派生类属性SetValue时出错
//类型“Client.com.Message[]”的对象无法转换为类型“Client.proto.p_item[]”。
uint arrlen = data.ReadUnsignedInt();
Message[] arrMsg = new Message[arrlen];
int index = 0;
while (index < arrlen)
{
data.ReadUnsignedByte();
data.ReadUnsignedByte();
data.ReadUnsignedByte();
string classname = (("Client.proto.") + data.ReadUTF());
Type classtype = Type.GetType(classname);
var obj = Activator.CreateInstance(classtype);
decode(data, (Message)obj);
arrMsg[index] = (Message)obj;
index;
}
msg.GetType().GetField(attr[0]).SetValue(msg, (Message[])arrMsg); //出错行
break;
}
}
public virtual string[][] getAttributes()
{
return null;
}
}
//派生类
public class p_role_data : Message, IMessage
{
// 此类3个属性,1,2能正确解析赋值,只有自定义数组类型的数据由于无法强制转换到派生类出错
public long role_id = 0;
public p_role_base rolebase = null;
public p_item[] items= null;
public void decode(ByteArray data)
{
base.decode(data, this);
}
override public string[][] getAttributes()
{
return (new string[][] { new string[] { "role_id", "long", "null" }, new string[] { "rolebase", "p_role_base", "null" }, new string[] { "items", "array", "p_item" }});
}
}
p_item也是Message的派生类
请教,在不改变现有处理方式的情况下,如何处理?
帖子只允许给100分,结贴有答案新帖加分,感谢指教。
相关推荐
详解C++中基类与派生类的转换以及虚基类
C++基类与派生类的转换 在公用继承、私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员。因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现。而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员)。因此,只有公用派生类才是基类真正的子类型,它完整地继承了基类的功能。 不同类型数据之间在一定条件下可以进行类型的转换,例如整型数据可以
在派生类的构造函数中调用基类的构造函数
《Visual C++2012入门经典(第6版)》实例,在派生类的构造函数中调用基类的构造函数
C++派生类与基类的转换规则
只有公用派生类才是基类真正的子类型,它完整地继承了基类的功能。基类与派生类对象之间有赋值兼容关系,由于派生类中包含从基类继承的成员,因此可以将派生类的值赋给基类对象,在用到基类对象的时候可以用其子类对象代替。 具体表现在以下几个方面: 派生类对象可以向基类对象赋值。 可以用子类(即公用派生类)对象对其基类对象赋值。如 A a1; //定义基类A对象a1 B b1; //定义类A的公用派生类B的对象b1 a1=b1; //用派生类B对象b1对基类对象a1赋值 在赋值时舍弃派生类自己的成员。 实际上,所谓赋值只是对数据成员赋值,对成员函数不存在赋值问题。请注意: 赋值后不能企图通过对象a1去访问派
基类,派生类
基类,派生类
C++基类指针和派生类指针之间的转换方法讲解
函数重载、函数隐藏、函数覆盖 函数重载只会发生在同作用域中(或同一个类中),函数名称相同,但参数类型或参数个数不同。 函数重载不能通过函数的返回类型来区分,因为在函数返回之前我们并不知道函数的返回类型。 函数隐藏和函数覆盖只会发生在基类和派生类之间。 函数隐藏是指派生类中函数与基类中的函数同名,但是这个函数在基类中并没有被定义为虚函数,这种情况就是函数的隐藏。 所谓隐藏是指使用常规的调用方法,派生类对象访问这个函数时,会优先访问派生类中的这个函数,基类中的这个函数对派生类对象来说是隐藏起来的。 但是隐藏并不意味这不存在或完全不可访问。通过 b->Base::func()访问基类中被隐藏的函数。


