关于C++的子类指针指向父类

 

1,直接用基类指针引用基类对象
2,直接用派生类指针引用派生类对象
3,用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的,
但是只能引用基类成员。若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。(解决该问题的答案是虚函数和多态性)
4,用派生类指针引用基类的对象。这种引用方式会导致语法错误。派生类指针必须先强制转换为基类指针,这种方法是不安全的。 

而在侯捷的深入浅出MFC中第二章C++重要性质中:
1、如果你以一个"基类之指针"指向一个"派生类之对象",那么经由该指针你只能调用该基类所定义的函数
2、如果你以一个“派生类之指针”指向一个“基类之对象”,你必须先做明显的转型操作(explicit cast),这种作法很危险。
3、如果基类和派生类都定义了“相同名称之函数”,那么通过对象指针调用成员函数时,到底调用了那个函数,必须视该指针的原始类型而定,而不是视指针实际所指的对象的类型而定,这与第1点其实意义相通。

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <stdlib.h>  
  3. using namespace std;  
  4. class A  
  5. {  
  6. public:  
  7.   char str[20];  
  8.   void f(){cout<<"class A"<<endl;}  
  9.   void fff(){cout<<"class A's str "<<str<<endl;}   
  10.   void add(){cout<<"class A address: "<<this<<endl;}  
  11. };  
  12. class B:public A  
  13. {  
  14. public:  
  15.   int i;  
  16.   char sb[20];  
  17.   B(){cout<<"class B constructor is run."<<endl;}  
  18.   ~B(){cout<<"class B destructor is run."<<endl;}  
  19.   void f(){cout<<"class B"<<endl;}  
  20.   void ff(){cout<<"class B "<<i<<str<<sb<<endl;}  
  21.   void add(){cout<<"class B address: "<<this<<endl;}  
  22. };  
  23. int main(int argc, char *argv[])  
  24. {  
  25.   //声明父类对象  
  26.   A b;  
  27.   //声明父类对象的指针,指向父类对象  
  28.   A *pa=&b;  
  29.   pa->add();  
  30.   //这个写法正确,不过很危险,因为pa到底是指向B还是A是不确定的.如果能明确的知道  
  31.   //pa是指向B类对象的,就如现在写的这个,那么没问题,如果pa指向A类对象,就会存在  
  32.   //风险.改变指针的类型,并不会影响内存分配既不会调用构造函数  
  33.   B *pb=(B *)pa;  
  34.   //类型强制转化后,指向的地址相同. 但会按转化类型访问数据成员.  
  35.   //成员函数属于类而不属于对象.各对象共用类的成员函数.强制转换成 B 类型后,可  
  36.   //调用类的成员函数。编译pb->add();后的代码只是调用add函数的时候传入了pb的对  
  37.   //象指针this  
  38.   pb->add();  
  39.   //由于pa指向的是父类对象的地址,这个指针被强制转换为派生类指针后,会出现内存越  
  40.   //界访问的情况,是不安全的.  
  41.   pb->i=100;  
  42.   char dsd[100];  
  43.   strcpy(pb->sb, " class B's sb.");  
  44.   strcpy(pb->str, " class A's str.");  
  45.   //pb->f()调用的具体函数,视指针的原始类型而定,而不是视指针实际所指的对象的  
  46.   //类型而定.如果是虚函数,则视实际所指的对象的类型而定  
  47.   pb->f();  
  48.   pb->ff();  
  49.   pb->fff();  
  50.   system("PAUSE");  
  51.   return 0;  
  52. }  
  53.  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值