动态投射子类

Casting children classes dynamically

本文关键字:子类 动态      更新时间:2023-10-16

我有以下类:

class Base{
public:
virtual int do_Something();
};
class ChildA : public Base {
public:
int do_Something();    // ChildA does something
};
class ChildB : public Base {
public:
int do_Something();    // ChildB does something
};

总的来说.cpp我想根据用户设置的特定配置创建一个对象ChildA()ChildB()。 我在函数main()中的尝试是:

...
int config = 1; // selected by the user
Base* classe;
std::cout<<typeid(classe).name() << std::endl;     // check class name
if (config==0){
classe= new ChildA();
}
else if (config==1){
classe= new ChildB();
std::cout<<typeid(classe).name() << std::endl;     // check class name
}
...

问题

我希望印刷的名称会有所不同。相反,输出是:

P4Base
P4Base

这里的问题是classe(Base *(不是多态的。这是一个简单的指针。您可以在输出中看到它。在带有GCC的Linux上,它是:P4Base,指向Base的指针

你想要的是typeid(*classe).name().输出为6ChildBChildB类型的对象。

多态性不会更改指针的类型(静态类型或动态类型(,但会更改对象的动态类型。

评论// check class name是错误的。该行

std::cout<<typeid(classe).name() << std::endl;

不检查类,而是检查指针。