这不应该是不正确的吗?:
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吗?
据我了解,这样做是不正确的。
这正是vtables的用途。非虚函数称为与容器类型匹配,虚函数称为与指向对象的类型匹配。
A* apb = (A*) &b;
....是完美的代码,并且是虚拟多态性的经典示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句