一般情况下,某个类型的指针一般不能指向其它类型对象,但基类型指针和派生类类型指针除外 --- 基类型指针可以指向任何派生类型的对象。
示例代码:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <cstring>
using namespace std;
class B_class {
char author[80];
public:
void put_author(char *s) { strcpy(author, s); }
void show_author() { cout << author << endl; }
};
class D_class : public B_class {
char title[80];
public:
void put_title(char *num) { strcpy(title, num); }
void show_title() { cout << "Title: " << title << endl; }
};
int main()
{
B_class *p;
B_class B_ob;
D_class *dp;
D_class D_ob;
p = &B_ob; //基类型对象地址
//通过基类型指针访问 B_class 类型的对象
p->put_author("beyes");
//通过基类型指针访问 D_class 类型对象
p = &D_ob;
p->put_author("Groad");
//输出保存在对象中的每个作者姓名
B_ob.show_author();
D_ob.show_author();
cout << "\n";
dp = &D_ob;
dp->put_title("The killer is not cold");
dp->show_title();
p->show_author(); //可以使用 p 或者 dp 访问 show_author() 函数
return 0;
}
运行输出:$ ./bip
beyes
Groad
Title: The killer is not cold
Groad 上面代码中,p 被声明为指向 B_class 类型的指针,它也可以用来指向 B_class 的派生类 D_class 的对象,并且可以用来访问派生类中从基类继承过来的成员,如 B_class 中的 show_author() 函数。但是需要注意的是,基类型指针不能访问在派生类中定义的成员!所以程序中不能使用 p->show_title() 这种形式的调用。
如果希望用基类型指针来访问派生类中的成员,必须先将它转换为派生类型的指针,如:((D_class *)p)->show_title(); 注意上面括号的用法,p 外面的括号是必须的。如果去掉外面的括号,变为 (D_class *)p->show_title(),那么表示的是将 show_title() 的返回结果转换为 D_class 的指针类型。
尽管上面通过转换的方式去访问派生类中的成员,但最好避免这么做,因为这比较容易混淆代码。
总之在一般情况下,基类型指针可以指向任何派生类的的对象,反之则不然,也就是说不能用派生类型的指针来访问基类型的对象。
此外,还需要注意一点:当基类型的指针指向派生类型对象时,指针的增量运算(++)或减量运算(--)是无效的。也就是说,它不会指向下一个或上一个派生类的对象。相反,它讲指向(指针认为是这样)下一个基类型对象。 |