曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3925|回复: 0
打印 上一主题 下一主题

基类指针与派生类指针

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-8-29 13:21:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一般情况下,某个类型的指针一般不能指向其它类型对象,但基类型指针和派生类类型指针除外 --- 基类型指针可以指向任何派生类型的对象

示例代码:
[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 的指针类型。

尽管上面通过转换的方式去访问派生类中的成员,但最好避免这么做,因为这比较容易混淆代码。

总之在一般情况下,基类型指针可以指向任何派生类的的对象,反之则不然,也就是说不能用派生类型的指针来访问基类型的对象

此外,还需要注意一点:当基类型的指针指向派生类型对象时,指针的增量运算(++)或减量运算(--)是无效的。也就是说,它不会指向下一个或上一个派生类的对象。相反,它讲指向(指针认为是这样)下一个基类型对象。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-17 23:30 , Processed in 0.064308 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表