有人可以解释代码的输出。
#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;
}
我期望通过转换为First来调用超类的方法。
提前致谢
尊重塞巴斯蒂安
答案 0 :(得分:4)
函数getB()
在基类中是virtual
,因此无论你有一个指向基类的指针还是指向派生的指针,你都可以得到派生的实现。
(这就是多态性的全部目的。)
答案 1 :(得分:2)
动态构建层次结构并不会改变您仍然指向B的基本事实。特别是,它不会更改用于查找将使用的getB()实现的vtable。
通常,您只需要dynamic_cast()来继承继承层次结构,而不是向上。
答案 2 :(得分:1)
只存在一个对象,即Second类型。
要获得您正在寻找的行为,您将不得不创建一个副本并对其进行切片:
First cTest = static_cast<First>(*t);
cout << cTest.getB() << endl;
答案 3 :(得分:0)
你没有用你的演员改变任何东西。您正在将First *转换为First *,这只是一个赋值。由于t是= new Second(2)
的秒,因此您已使用子项的条目覆盖虚拟表,因此它将调用子项的方法而不是父项。
cTest只是一个指向First的指针,指向与t完全相同的对象,因为cTest和t包含相同的内存地址,在该地址存在第二个对象,这就是调用Second的方法的原因。 / p>