奇怪的铸造行为

时间:2011-05-27 14:52:37

标签: c++ casting polymorphism virtual

有人可以解释代码的输出。

#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来调用超类的方法。

提前致谢

尊重塞巴斯蒂安

4 个答案:

答案 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>