奇怪的铸造行为

| 有人可以解释代码的输出。
#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而被调用。 提前致谢 问候塞巴斯蒂安     
已邀请:
        函数
getB()
在基类中是
virtual
,因此无论您具有指向基址的指针还是指向派生的指针,都可以获取派生的实现。 (这就是多态的全部目的。)     
        动态填充层次结构不会更改您仍然指向B的基本事实。特别是,它不会更改用于查找将要使用的getB()实现的vtable。 通常,只需要dynamic_cast()即可继承继承层次结构,而无需继承。     
        仅存在一个对象,其类型为Second。 为了获得您想要的行为,您将必须创建一个副本并将其切片:
First cTest = static_cast<First>(*t);
cout << cTest.getB() << endl;
    
        您不会改变演员表的任何内容。您正在将First *转换为First *,这只是一个分配。由于t是带有4的Second,因此您已用子项的条目覆盖了虚拟表,因此它将调用子项的方法,而不是父项。 cTest只是指向First的指针,它指向与t完全相同的对象,因为cTest和t包含相同的内存地址,在该内存地址处存在Second对象,这就是调用Second方法的原因。     

要回复问题请先登录注册