免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6074 | 回复: 4
打印 上一主题 下一主题

请教:指向基类/派生类指针,指向基类成员/派生类成员指针,及互相赋值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-25 11:00 |只看该作者 |倒序浏览
Bjarne Stroustrup著 裘宗燕译 C++程序设计语言(特别版) Page373/374

从书上理解:可以安全地将一个指向基类成员的指针赋值给一个指向派生类的成员
            的指针,反过来不行。
            另外,可将一个指向派生类对象的指针赋值给一个指向基类得指针,
            即基类指针可在不加显式转换的情况下指向派生类对象。
不懂的地方:上述两个规则都是为了维护一种基本保证:如果一个对象所提供的性
            质少于某个指针允诺的话,该指针就不能指向这个对象。

达人请帮忙解释一下我不懂的地方,谢谢。

代码测试如下,结果确实如上面所说:
      #include ...
        class Base
        {
        public:
                Base() {}
                virtual ~Base(){}                       
                virtual void show() { cout << "Base"; }
        };
        class Derived:public Base
        {
        public:
                Derived():Base() {}
                ~Derived() {}
                void print() {}
                void show() { cout << "Derived"; }
        };

        int main()
        {
        Base base;               
        Derived derived;
               Base *pb = &derived;  // Ok,基类指针指向派生类对象;
        Derived *pd = &base;  // Error,派生类指针指向基类对象;
           pb->show();   //Ok,但输出 derived;
           pb->print();  //Error. 不可调用仅派生类有的方法;

        typedef void (Derived::*Pderived)();
        Pderived pmend = & Base::show;  // Ok,基类成员的指针赋值
                                               //给派生类成员的指针
        (derived.*pmend)();             // 使用派生类成员指针

          typedef void (Base::*Pbase)();
               Pbase pmenb = & Derived::show;  // Error.派生类成员的指针
                                               //赋值给基类成员的指针
        }

论坛徽章:
0
2 [报告]
发表于 2007-04-25 11:30 |只看该作者
打个比方:可以说你长的像你爸爸,但反过来不能说你爸爸长的像你~~

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
3 [报告]
发表于 2007-04-25 16:12 |只看该作者

回复 1楼 cinhwa 的帖子

这个应该对你有帮助: C++的多态性实现机制剖析

论坛徽章:
0
4 [报告]
发表于 2007-04-25 16:36 |只看该作者
从书上理解:可以安全地将一个指向基类成员的指针赋值给一个指向派生类的成员
            的指针,反过来不行。

基类成员的指针?派生类的成员的指针?
什么意思?成员指针????

            另外,可将一个指向派生类对象的指针赋值给一个指向基类得指针,
            即基类指针可在不加显式转换的情况下指向派生类对象。

不懂的地方:上述两个规则都是为了维护一种基本保证:如果一个对象所提供的性
            质少于某个指针允诺的话,该指针就不能指向这个对象。

子类许诺>父类许诺

这种书,咬文嚼字,很累的。
作者把C++翻译成作者母语;
你把作者母语翻译成C++;

你的难度比作者大。-_-!

找点经典的书,一般标志是直击C++,而不是转换成作者的母语。
推荐先看C++Primar,再看Inside the C++ Object Model。

论坛徽章:
0
5 [报告]
发表于 2009-05-12 16:45 |只看该作者
从书上理解:可以安全地将一个指向基类成员的指针赋值给一个指向派生类的成员
            的指针,反过来不行。
            另外,可将一个指向派生类对象的指针赋值给一个指向基类得指针,
            即基类指针可在不加显式转换的情况下指向派生类对象。


什么意思 ?有答案了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP