多态结构声明

时间:2014-04-17 16:46:27

标签: c++ struct polymorphism

我确信之前已经提出过这个问题并得到了解答,但我在没有正确术语的情况下进行搜索时遇到了问题。

我有两个独特的结构A& B(不是课程)。我的代码使用函数重载来不同地处理结构。我不明白如何处理声明多态。我为一个伪代码示例道歉。

if( flag ==1 ){
   declare stuct A scoped to main
}
else{
   declare stuct B scoped to main
}

上面的伪代码不起作用,因为声明在if语句中作用域。由于我试图描述的范围问题,我的“真实”代码无法编译。

修改

澄清:

根据指定的标志(arg),我想声明两个不同结构中的一个。一旦声明了正确的结构,所有多态性都已由操作重载处理。

谢谢

1 个答案:

答案 0 :(得分:2)

这个问题从根本上与结构,类或多态无关(虽然解决方案确实需要后者)。

它是关于尝试有条件地声明不同类型的对象,而不会遇到阻塞范围。简单的答案就是你做不到。

通常的方法是使用延迟初始化的智能指针:

#include <memory>
#include <cstdlib>

struct A { virtual ~A() {} };
struct B : A {};
struct C : A {};

void f(A&);

int main()
{
   srand(time(0));
   const int x = rand();

#if 0
   /** Can't do this: **/
   if (x > 500)
      B obj;
   else
      C obj;

   f(obj);
#endif

   /** Can do this: **/
   std::unique_ptr<A> ptr;
   if (x > 500)
      ptr.reset(new B);
   else
      ptr.reset(new C);

   f(*ptr);

#if 0
   /** Some older examples may propose this: **/
   A* ptr = NULL;
   if (x > 500)
      ptr = new B;
   else
      ptr = new C;

   f(*ptr);

   delete ptr;
   ptr = NULL;
#endif
}

由于f接受了引用,即使您正在为A提供多态,也会保持多态性。

通常,您实际上通过ptr调用成员函数,使用虚拟调度来确保执行正确的代码:

   std::unique_ptr<A> ptr;
   if (x > 500)
      ptr.reset(new B);
   else
      ptr.reset(new C);

   ptr->someFunction();

无需重载功能。