首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问:指向基类/派生类指针,指向基类成员/派生类成员指针,及互相赋值

2012-03-24 
请教:指向基类/派生类指针,指向基类成员/派生类成员指针,及互相赋值BjarneStroustrup著裘宗燕译C++程序设

请教:指向基类/派生类指针,指向基类成员/派生类成员指针,及互相赋值
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.派生类成员的指针赋值给
                                                                                  //   基类成员的指针
                }


[解决办法]
“如果一个对象所提供的性质少于某个指针允诺的话,该指针就不能指向这个对象。”

派生类,一般会基于基类的基础之上,再增加一些成员,比如增加一个 成员函数或者成员变量。

这样,
派生类指针, 它指向派生类, 应该具有这个 增加的成员函数/变量;
基类对象, 它不具有这个 派生部分,
就是说 “基类对象”所提供的性质少于“派生类指针”允诺,
所以, “派生类指针”不能指向基类对象 ~
[解决办法]
可将一个指向派生类对象的指针赋值给一个指向基类得指针,即
基类指针可在不加显式转换的情况下指向派生类对象
==================================================
加上vitual就能成为多态
[解决办法]
派生类一般会增加自己的东西,这样就会比基类多出一些变量,由下向上强制类型转换属于上束强制,会丢失一些信息,造成潜在的bug.一般不建议使用由下向上强制类型转换。
[解决办法]
我给你一种方法:
c++中不允许少的给多的赋值
而允许多的给少的赋值:不知道你是否能理解?
在进一步解释,
即允许大的给小的赋值,多余的扔了
但是如果小的给大的赋值,就会出现有些参数没被传递,会出错。!!

热点排行