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*。不清楚真正的需要是什么,但调用基类可能更好版本明确: