上面的例子我称为“反多态”,因为,通过一个多态的指针(多态时是父类型的指针,上面的例子是子类型的指针)访问普通成员函数时访问的是子类的函数(刚好和多态相反),通过子类的指针访问虚函数时访问的是父类的函数(也刚好和多态相反)。
这种行为很危险,你创建的是Base对象,然后强转为Derived指针,Derived对象占用空间比Base大,如果用子类指针访问子类的元素,访问就越过了Base的对象范围了,undefined behavior!!! fun()是虚函数,this_fun()是普通函数 虚函数是根据实际指向的对象来判断调用父类还是子类的函数的。虽然是Derived指针,但是实际指向的是Base...
问题二:因为pd1指针是指向D的,所以调用b1,是去D的公共函数区调用,于是“ fun in D"问题三:m_d1是数据,pd1按照D的方式去取B对象的数据,而B没有这个数据,于是访问未知地址,得到乱码 问题四:同二,类的函数是放在公共函数区的,所以哪怕不是类对象,也可以成功调用 画了个图,辅助上面的...
父类指针强转子类指针失败? 大漠刀客 18515092 发布于 2019-10-14 class Base { public: Base(int i) :a(i) { b = 3; } void virtual fun() { cout << "父类fun函数" << endl; } void this_fun( Base *b ) { if (b == this) { cout << "父类this" << endl; } } private: in...