不论是上面说的哪种强制转换情况,强转后的指针在调用虚函数时失效,其他情况正常调用。 理解: 1.子类指针强转成父类指针,使用这个父类指针调用成员函数,本来是应该调用父类自己的成员函数的,但由于子类的同名成员函数为虚函数(父类的对应成员函数标为虚函数了),强转失效了,调用的还是子类的成员函数。 2.父类指...
上面的例子我称为“反多态”,因为,通过一个多态的指针(多态时是父类型的指针,上面的例子是子类型的指针)访问普通成员函数时访问的是子类的函数(刚好和多态相反),通过子类的指针访问虚函数时访问的是父类的函数(也刚好和多态相反)。
父类指针指向子类对象,然后调用子类对象所继承(或改写)的父类方法,这就是面向对象的核心--多态 其实也好理解,子类对象的类型与其父类的类型是共通的,他就是从父类继承来的,如果把子类比父类新增的成员变量或成员函数去掉,他就是一个父类的对象,当然可以调用自己的方法 不过,一般多态不是楼主这么用的...
父类指针转换成子类指针 有如下定义: class A {}; class B : public A{}; A* pA = new B; 下列代码无法完成转换的是( ) A) B* pB = static_cast<B*>(pA); B) B* pB = reinterpret_cast<B*>(pA); C) B* pB = dynamic_cast<B*>(pA); D) B* pB = (B*)pA; error C2683: dyn...
指针转换在C++中再正常不过了,特别是子类向父类的转换,一般情况下转换后指针值是不会变的。但是某些特殊情况,子类指针转换成父类指针,指针值会产生一定的偏移量,至于为什么就不清楚了。要确保指针值不变,可以先将指针转成void*,再根据实际情况强制转换成需要的类型就可以了。
为了兼容C语言,“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起。实际上,如果需要解决这种问题,那类型应该怎么改呢?其实我们可以跟C#一样引入Derived[]的这种指针类型。这还是new[]出来的东西,C++里面也可以要求delete[],但是区别是他再也不能转成Base[]了。只可惜,T[...
为了兼容C语言,“new[]的指针需要delete[]”和“子类指针可以转父类指针”的两条规则成功的冲突到了一起。实际上,如果需要解决这种问题,那类型应该怎么改呢?其实我们可以跟C#一样引入Derived[]的这种指针类型。这还是new[]出来的东西,C++里面也可以要求delete[],但是区别是他再也不能转成Base[]了。只可惜,T[...