Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态转换子类_C++_Class_Inheritance_Casting_Polymorphism - Fatal编程技术网

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;