Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.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++_Casting_Polymorphism_Virtual - Fatal编程技术网

C++ 奇怪的铸造行为

C++ 奇怪的铸造行为,c++,casting,polymorphism,virtual,C++,Casting,Polymorphism,Virtual,有人能解释一下代码的输出吗 #include <iostream> using namespace std; class First { public: int a; First() {}; First(int a) { this->a = a; }

有人能解释一下代码的输出吗

#include <iostream>

using namespace std;

class First {
        public:
                int a;
                First() {};
                First(int a) {
                        this->a = a;
                }

                int getA() {
                        return a;
                }

                virtual int getB() {
                        cout << "getB() from super class..." << endl;
                        return 0;
                }
};

class Second : public First {
        public:
                int b;
                Second(int b) {
                        this->b = b;
                }

                int getB() {
                        cout << "getB() from child class..." << endl;
                        return b;
                }

};

int main() {
        First* t = new Second(2);
        First* cTest = dynamic_cast<First*>(t);
        cout << cTest->getB() << endl;

}
#包括
使用名称空间std;
头等舱{
公众:
INTA;
第一{};
第一(INTA){
这->a=a;
}
int getA(){
返回a;
}
虚拟int getB(){
cout函数
getB()
在基类中是
virtual
,因此无论是指向base的指针还是指向derived的指针,都可以获得派生实现


(这就是多态性的全部目的。)

层次结构的动态转换不会改变一个基本事实,即您仍然指向A B。特别是,它不会改变用于查找将要使用的getB()实现的vtable


通常,您只需要使用dynamic_cast()沿继承层次结构向下,而不是向上。

您的cast没有任何更改。您正在将第一个*转换为第一个*,这只是一个赋值。因为t是第二个,且
=new Second(2)
,您已经用子项覆盖了虚拟表,因此它将调用子项的方法而不是父项


cTest只是指向第一个对象的指针,它指向与t完全相同的对象,因为cTest和t包含相同的内存地址,其中存在第二个对象,这就是调用第二个对象的方法的原因。

只有一个对象,属于第二类

要获得您想要的行为,您必须创建一个副本并对其进行切片:

First cTest = static_cast<First>(*t);
cout << cTest.getB() << endl;
First-cTest=static_cast(*t);

哦,不,8个空格的压痕伤了我的眼睛看起来像是一个面试问题…输出是:getB(),来自child类…2你在第一个*到第一个*…为什么你需要一个演员?有没有办法“真的”将其强制转换为First?以便使用First方法?@Sebastian:在您用派生类的方法替换所有虚拟表项之后,我不知道您可以使用哪种方法来还原此项。如果您发布更大的问题,我们可能会帮您找到解决问题的不同方法。@Sebastian:根据DanDan在下面,您可以取消引用指针并将其强制转换为第一个对象。这会起作用,但我强烈建议您找出一种更好的方法来解决您试图解决的问题。他不是在构建层次结构,而是在将First*转换为First*。不清楚真正的需要是什么,但调用基类可能更好版本明确: