让我们举一个例子:
class Parent{
}
class Derived1:public Parent{
public:
int x;
}
class Derived2:public Parent{
public:
int y;
}
main()
{
int i;
std::cin >> i;
Parent *p;
switch(i)
{
case 0:
p = new Derived1()
static_cast<Derived1>(p)-> x = 1;
break;
case 1:
p = new Derived2()
static_cast<Derived2>(p)-> y = 2;
break;
}
process(*p);
}
是否建议使用向下转换来设置派生类成员变量?是否有更清洁的替代方案?
答案 0 :(得分:1)
你的演员表是错误的,你需要转换为指针(p
是一个指针):
static_cast<Derived1*>(p)
^
你不需要那些演员,只需将派生指针分配给基础演员:
Parent *p;
switch(i)
{
case 0:
{
Derived1* d1 = new Derived1();
d1->x = 1;
p = d1;
break;
}
case 1:
{
Derived2* d2 = new Derived2();
d2-> y = 2;
p = d2;
break;
}
}
答案 1 :(得分:0)
首先,您的代码已损坏。 如果将父类转换为派生类,则应该转换指针或引用。
static_cast<Derived1*>(p)
而不是创建对象,然后设置字段,您可以将其作为参数传递给构造函数,例如。
p = new Derived1(x)
实际上,只要您知道对象具有什么类型,您就可以安全地将指针转换为父对象。但我还没有看到任何建议这样做。