1.如题。如果是基本类型的指针指向另外一个类型的对象,编译器会报错。那么题目这个情况,会被编译器的类型安全检查出来而编译出错么?
经过实测,不会报错。C++允许这样的情况存在。
2.那么就会问一个问题,这个指针调用的数据成员或者成员函数是谁的呢?
经过测试,是基类的。
3.那么就会继续问一个问题,能用这个指针调用派生类的东西吗?
经过测试,可以。但是需要用强制类型转换,将这个指针转换成派生类的指针。
ps.当一个基类指针用new指向一个派生类时,基类和派生类都会初始化一个对象,各自维护。调用哪一个取决于指针是何种类型。
最后是测试程序,大家随意感受一下~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A(int aa=88) 8 :a(aa) 9 { 10 11 } 12 void f() 13 { 14 cout<<"A"<<endl; 15 } 16 17 int a; 18 }; 19 class B : public A 20 { 21 public: 22 B(int ba= 77, int bb=66) 23 :a(ba),b(bb) 24 { 25 26 } 27 void f() 28 { 29 cout<<"B"<<endl; 30 } 31 32 int a; 33 int b; 34 }; 35 36 37 void main() 38 { 39 A* p=new B; 40 p->f(); 41 (*p).f(); 42 static_cast<B*>(p)->f(); 43 cout<<p->a<<endl 44 <<static_cast<B*>(p)->a<<endl 45 <<static_cast<B*>(p)->b<<endl; 46 delete p; 47 }
输出是