C ++多态性。为什么这样运作?

史考特

这不应该是不正确的吗?

A* apb = (A*)&b; //a pointer to b

我期望有一个错误,或者至少是一个警告。

为什么在Visual C ++ 2013(v120)或g ++(gcc 4.8.2)中没有给我任何警告?

#ifndef A_H
#define A_H

#include <stdio.h>

class A
{
public:
   A(){}
   virtual ~A(){}
   void print(){ printf("printA\n"); }
   virtual void printVirtual(){ printf("printVirtualA\n"); }
};

#endif // A_H

#ifndef B_H
#define B_H

#include "A.hpp"
class B : A
{
public:
   B(){}
   void print(){ printf("printB\n"); }
   virtual void printVirtual(){ printf("printVirtualB\n"); }
};

#endif //B_H

int main()
{
   A a;
   B b;
   A* apb = (A*)&b; //a pointer to b
   B* bpa = (B*)&a; //b pointer to a

   apb->print();         // printA
   apb->printVirtual();  // printVirtualB
   bpa->print();         // printB
   bpa->printVirtual();  // printVirtualA
   return 0;
}

输出:

printA
printVirtualB
printB
printVirtualA

我怀疑这是因为我的类在内存中对齐,所以有一个有效的Vtable。

这是“隐式” dynamic_cast吗?

据我了解,这样做是不正确的。

朱尔斯·GM

这正是vtables的用途。非虚函数称为与容器类型匹配,虚函数称为与指向对象的类型匹配。

A* apb = (A*) &b;

....是完美的代码,并且是虚拟多态性的经典示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章