我试图上课,但有些事情是错的。我正在尝试static_cast<>
,dynamic_cast<>
,但仍然遇到错误。我需要一个包含2种类的数组。
class user
{
int value;
user(int valueInit)
{
value = valueInit;
};
int getValue()
{
return value;
}
};
class premium : public user
{
int premiumValue;
premium(int valueInt, int premiumValueInit)
{
value = valueInt;
premiumValue = premiumValueInit;
};
};
这是main()
函数
user fUser(10);
premium fPremium(20, 5);
premium *array = new premium[2];
(user)array[0] = u1;
array[1] = p1;
cout << "Value: " << array[0].getValue() << endl; //incorrect/random value
cout << "Value: " << array[1].getValue() << endl; //correct value
通常我使用java,所以我的c ++存在很大问题。我知道我应该做什么,但我不知道如何。
答案 0 :(得分:1)
原因
您的演员阵容(user)array[0] = u1
的问题在于它在理论上等同于以下代码:
{
user unnamed_instance = array[0];
unnamed_instance = u1;
}
在(T)a = b;
中,将创建一个未命名的临时文件,其类型为T
,而其初始化值为b
。您要分配给此未命名的临时,而不是a
。
注意:在这种情况下slicing发生,即。 array[0]
中具有premium
类型的值将被切分为user
。功能
解决方案
如果您希望将array[0]
中的值视为user
类型而不引入临时值,则需要使用指针或引用。以下内容会正确地将u1
分配给array[0]
,就像array[0]
类型为user
一样。
// using a reference
static_cast<user&> (array[0]) = u1;
// using a pointer
user * ptr = static_cast<user*> (&array[0]);
*ptr = u1;