我对C ++比较陌生。我们有一个抽象基类和2个派生类。
class PositionBase (abstract)
class PositionLenght: PositionBase
class PositionAngle: PositionBase
PositionBase包含获取名称之类的功能。
派生类具有诸如GetLenght()
或GetAngle();
(旧)应用程序包含一个包含派生类的数组。
假设我从array[1]
获取对象,并且根据其类型,我想运行GetLength() or GetAngle()
。然后,我需要知道从数组中获得的对象类型。
当我使用时:
if(PositionBase->IsKindOf(RUNTIME_CLASS(PositionLenght))))
{do something}
它不起作用。有效的是
if(typeid(*PositionBase) == typeid(PositionLenght)))
{do something}
我也可以只“ dynamic_cast
”对象,如果它不返回NULL,那就很好。
在C#
中我将使用接口,在C++
中处理此问题的首选方法是什么?
答案 0 :(得分:0)
如果我很好理解,您需要的是:
在C ++中,您可以将派生类的指针存储到基类(抽象)的指针数组中。 从那里, 当您从数组中获取指向基数的指针时, 如果您需要派生类中的特定功能, 比你需要的 使用dynamic_cast强制转换为base的派生对象,并检查结果以查看强制转换是否成功以及是否可以调用所需的函数。
答案 1 :(得分:0)
完全相同(与C#中相同)。您可以在基类中定义虚函数,并在派生类中用所需的功能覆盖它:
class PositionBase {
public:
virtual void do_something() = 0;
};
class PositionLenght: public PositionBase {
void do_something() override {
std::cout << "doing something for length\n";
}
};
class PositionAngle: public PositionBase {
void do_something() override {
std::cout << "doing something for angle\n";
}
};
int main() {
PositionBase *arr[] = {
new PositionLenght(),
new PositionAngle(),
};
for(auto i = 0; i < 2; ++i) arr[i]->do_something();
}
将打印:
doing something for length
doing something for angle