从公共基类继承的对象的条件声明,以将引用传递给其中一个对象

问题描述 投票:0回答:1

说我有两个从一个共同的基础继承的类,例如

class Thing{
public:
    virtual int f()=0;
};

class Thing_variant_a: public Thing{
public:
    int f(){
        std::cout<<"I am (a)"<<std::endl;
    }
};

class Thing_variant_b: public Thing{
public:
    int f(){
        std::cout<<"I am (b)"<<std::endl;
    }
};

以及一个将对Thing对象的引用作为参数的函数。

void function(Thing& t){
    t.f();
}

根据条件,我想用functionthing_a来调用thing_b(并且可能在某个时候扩展它,从而增加thing_c的另一种可能性)

我知道我可以使用指针来做到这一点

Thing *t = nullptr;
if(condition_a){
    t = new Thing_variant_a();
} else if(condition_b){
    t = new Thing_variant_b();
}

function(*t);

但是,我想知道是否还有更好的方法

  • 不分配堆内存

  • 不需要我在某些时候删除t(可能是智能指针,但是我对此不太了解)

  • 确保我总是将有效的Thing引用传递给函数(在复杂的结构中可能比在此最小示例中有更多的条件)我可以执行if(t){ function(*t);}else{/*handle error*/}),但似乎应该有一个更优雅的选择解决方案。

如果不是以上所有内容都可以将它们组合在一起吗?

c++ inheritance memory-management pass-by-reference
1个回答
0
投票

这是一种无需使用堆或指针的方法:

Thing_variant_a thingA;
Thing_variant_b thingB;

if(condition_a){
    function(thingA);
} else if(condition_b){
    function(thingB);
}

如果需要,可以通过三元运算符使其更简单:

Thing_variant_a thingA;
Thing_variant_b thingB;
function(condition_a ? static_cast<Thing &>(thingA) : static_cast<Thing &>(thingB));
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.