您的位置:首页 > 编程语言 > C语言/C++

[转载]关于C++的子类指针指向父类.

2014-04-25 23:56 381 查看
http://blog.sina.com.cn/s/blog_3ce156ce01000af4.html

1,直接用基类指针引用基类对象

2,直接用派生类指针引用派生类对象

3,用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的,

但是只能引用基类成员。若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。(解决该问题的答案是虚函数和多态性)

4,用派生类指针引用基类的对象。这种引用方式会导致语法错误。派生类指针必须先强制转换为基类指针,这种方法是不安全的。 

而在侯捷的深入浅出MFC中第二章C++重要性质中:

1、如果你以一个"基类之指针"指向一个"派生类之对象",那么经由该指针你只能调用该基类所定义的函数

2、如果你以一个“派生类之指针”指向一个“基类之对象”,你必须先做明显的转型操作(explicit cast),这种作法很危险。

3、如果基类和派生类都定义了“相同名称之函数”,那么通过对象指针调用成员函数时,到底调用了那个函数,必须视该指针的原始类型而定,而不是视指针实际所指的对象的类型而定,这与第1点其实意义相通。

#include <iostream>

#include <stdlib.h>

using namespace std;

class A

{

public:

  char str[20];

  void f(){cout<<"class A"<<endl;}

  void fff(){cout<<"class A's str "<<str<<endl;} 

  void add(){cout<<"class A address: "<<this<<endl;}

};

class B:public A

{

public:

  int i;

  char sb[20];

  B(){cout<<"class B constructor is run."<<endl;}

  ~B(){cout<<"class B destructor is run."<<endl;}

  void f(){cout<<"class B"<<endl;}

  void ff(){cout<<"class B "<<i<<str<<sb<<endl;}

  void add(){cout<<"class B address: "<<this<<endl;}

};

int main(int argc, char *argv[])

{

  //声明父类对象

  A b;

  //声明父类对象的指针,指向父类对象

  A *pa=&b;

  pa->add();

  //这个写法正确,不过很危险,因为pa到底是指向B还是A是不确定的.如果能明确的知道

  //pa是指向B类对象的,就如现在写的这个,那么没问题,如果pa指向A类对象,就会存在

  //风险.改变指针的类型,并不会影响内存分配既不会调用构造函数

  B *pb=(B *)pa;

  //类型强制转化后,指向的地址相同. 但会按转化类型访问数据成员.

  //成员函数属于类而不属于对象.各对象共用类的成员函数.强制转换成 B 类型后,可

  //调用类的成员函数。编译pb->add();后的代码只是调用add函数的时候传入了pb的对

  //象指针this

  pb->add();

  //由于pa指向的是父类对象的地址,这个指针被强制转换为派生类指针后,会出现内存越

  //界访问的情况,是不安全的.

  pb->i=100;

  char dsd[100];

  strcpy(pb->sb, " class B's sb.");

  strcpy(pb->str, " class A's str.");

  //pb->f()调用的具体函数,视指针的原始类型而定,而不是视指针实际所指的对象的

  //类型而定.如果是虚函数,则视实际所指的对象的类型而定

  pb->f();

  pb->ff();

  pb->fff();

  system("PAUSE");

  return 0;

}

//总结就是(标题点亮重点:子类指针指向父类):  只建立了父类的对象A, A::this的对象地址都没变,转换前后虽然指向的对象都是pa(父类对象地址),调用的时候却只根据子类指针实际类型去调用函数..编译器建立类的时候就确定类的成员函数名字,如add_A_XXX  

指向基类的指针可以指向派生类,反之不行.  关键是这里根本没有创建派生类的对象.单纯用派生类指针调用他的函数而已

3,用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的,

但是只能引用基类成员。若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误。(解决该问题的答案是虚函数和多态性)

1、如果你以一个"基类之指针"指向一个"派生类之对象",那么经由该指针你只能调用该基类所定义的函数

3、如果基类和派生类都定义了“相同名称之函数”,那么通过对象指针调用成员函数时,到底调用了那个函数,必须视该指针的原始类型而定,而不是视指针实际所指的对象的类型而定,这与第1点其实意义相通。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: