c++ - 多态结构声明

标签 c++ struct polymorphism

我确信这个问题之前已经被问过和回答过,但是如果没有正确的术语,我在搜索时遇到了麻烦。

我有两个独特的结构 A 和 B(不是类)。我的代码使用函数重载来区别对待结构。我不明白如何处理声明多态性。我为伪代码示例道歉。

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

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

编辑

澄清:

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

谢谢

最佳答案

这个问题基本上与结构、类或多态无关(尽管解决方案确实需要后者)。

它是关于尝试有条件地声明不同类型的对象,而不与 block 作用域冲突。简单的答案是你不能。

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

#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 调用成员函数,使用虚拟分派(dispatch)来确保执行正确的代码:

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

   ptr->someFunction();

不需要函数重载。

关于c++ - 多态结构声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23138929/

相关文章:

c++ - 在 C++ 中读取大字符串——有安全快速的方法吗?

python - 将十六进制字符串转换为长python

c# - 多态方法仅调用一次时运行两次

c++ - 外部 "C"时无法使用 cout/endl

c++ - 管理单个字符串的内存

c - 如何将指针分配给此数组(OpenCL)中某些结构的数组元素?

c - 使用 csv 文件的输入填充结构体数组

scala - 重载泛型隐式转换

swift - 从元类型数组创建类实例

c++ - 为什么 WindowStateChange 事件对我不起作用