zev*_*erg 1 c++ polymorphism struct
我确信这个问题之前已经被问过并得到回答,但如果没有正确的术语,我在搜索时遇到困难。
我有两个独特的结构 A 和 B (不是类)。我的代码使用函数重载来以不同的方式处理结构。我不明白如何处理声明多态性。对于伪代码示例,我深表歉意。
if( flag ==1 ){
declare stuct A scoped to main
}
else{
declare stuct B scoped to main
}
Run Code Online (Sandbox Code Playgroud)
上面的伪代码将不起作用,因为声明的范围在 if 语句内。由于我试图描述的范围问题,我的“真实”代码无法编译。
编辑
澄清:
根据指定的标志(arg),我想声明两个不同的结构之一。一旦声明了正确的结构,所有多态性都已由操作重载处理。
谢谢
这个问题基本上与结构、类或多态性无关(尽管解决方案确实需要后者)。
它是关于尝试有条件地声明不同类型的对象,而不与块作用域发生冲突。简单的答案是你不能。
通常的方法是使用后期初始化的智能指针来代替:
#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
}
Run Code Online (Sandbox Code Playgroud)
由于f接受引用,即使您向其提供A.
通常,您实际上会通过使用虚拟分派来调用成员函数ptr,以确保执行正确的代码:
std::unique_ptr<A> ptr;
if (x > 500)
ptr.reset(new B);
else
ptr.reset(new C);
ptr->someFunction();
Run Code Online (Sandbox Code Playgroud)
不需要函数重载。
| 归档时间: |
|
| 查看次数: |
9670 次 |
| 最近记录: |