是建议使用向下转换来设置派生类成员变量的做法吗?

时间:2014-09-01 05:15:37

标签: c++ polymorphism

让我们举一个例子:

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);
}

是否建议使用向下转换来设置派生类成员变量?是否有更清洁的替代方案?

2 个答案:

答案 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)

实际上,只要您知道对象具有什么类型,您就可以安全地将指针转换为父对象。但我还没有看到任何建议这样做。