C++ 动态转换子类
我有以下课程:C++ 动态转换子类,c++,class,inheritance,casting,polymorphism,C++,Class,Inheritance,Casting,Polymorphism,我有以下课程: 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 };
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
};
在my main.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
}
...
这里的问题是
classe
(Base*
)不是多态的。这是一个简单的指针。您可以在输出中看到它。在使用GCC的Linux上,它是:P4Base
,指针指向Base
您需要的是typeid(*classe).name()
。输出为6ChildB
,对象类型为ChildB
多态性不会更改指针的类型(既不是静态类型也不是动态类型),但会更改对象的动态类型
注释//检查类名错误。线路
std::cout<<typeid(classe).name() << std::endl;
std::coutWhat是渲染器
?这是Python还是C++ ++代码?如果CONFIG= 0:< /代码>?对不起,我纠正了它。这是一个类classe
可能会引导你走向正确的方向。@ThomasSablik谢谢,这个问题现在应该是正确的。不,它不正确。很明显,你没有试图编译它。谢谢。我的目标不是打印的名称是正确的,而是转换正确的子类。我是否应该修改if-else语句中的强制转换?@maurock我在你的代码中看不到任何强制转换。类型是正确的。你什么都不用做classe->do_Something()
将调用ChildB::do_Something()
。我希望指针指向正确的类。现在,我知道指针总是指向父类Base
。相反,当参数config
等于1
时,我希望指针classe
指向ChildB
,因为指针不指向类。它指向一个实际的对象typeid
返回类型。classe
的类型是Base*
,您不能更改它。但是它指向了一个类型为ChildB
的对象,正如您在这里看到的:谢谢您的解释。我的困惑是因为,如果我在头中初始化一个变量,它就不会被正确地检索到。下面的示例显示了在Base中初始化int a=1
,在ChildB中初始化int a=2
。打印此值将返回1而不是2,这可能需要另一篇文章?
std::cout<<typeid(classe).name() << std::endl;