我有两个从{"jasper"}
{"526"}
{"地理"}
类继承的类
Base
现在我要编写一个函数,该函数采用基类指针对象,并在动态强制转换后找到合适的子代并将其返回,以便我们可以调用正确版本的struct Base
{
virtual ~Base() = default;
};
class Derived_1:public Base
{
public:
void getSomeFunc();
};
class Derived_2:public Base
{
public:
void getSomeFunc();
};
我试图写
getSomeFunc()
但是它没有被编译。可以满足我的要求的任何方式。
编辑1 ----------------------------------
编译器错误为-auto getChild(Base* ptr)
{
Derived_1 * p = dynamic_cast<Derived_1*>(ptr)
if(p)
{
return p;
}
else
{
Derived_2 * q = dynamic_cast<Derived_2*>(ptr)
if(q)
{
return q;
}
else
{
// some handling to avoid bugs!!
}
}
。
编译为incorrect deduction of 'auto'
答案 0 :(得分:4)
几乎可以肯定这不是您想要做的。相反,请使用虚拟方法:
class Base {
public:
virtual void getSomeFunc() = 0;
// ... etc etc ...
};
然后,您可以编写:
Base* ptr = get_a_base_instance_ptr_from_somewhere();
ptr->getSomeFunc();
在您的代码中,您试图让auto
的类型为p
或q
的类型为。但是auto
仅具有单个类型。而且可以接受指向Derived_1
的指针和指向Derived_2
的指针的类型是……是的,您猜对了:Base*
。
编辑:如果您无法更改Base
,Derived_1
和Derived_2
类,则可以考虑使用std::variant<Derived_1*, Derived_2*>
并使用访问以针对每种类型调用适当的方法。如果您以前没有使用过变体,请参见CPP-reference page on std::variant
。有关如何编写用于变体的访问者的信息,请参见以下SO问题: