可以安全地将一个指向基类成员的指针赋值给一个指向派生类的成员的指针,反过来不行。
另外,可将一个指向派生类对象的指针赋值给一个指向基类得指针,
即基类指针可在不加显式转换的情况下指向派生类对象。
代码测试如下,结果确实如上面所说:
#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.派生类成员的指针
//赋值给基类成员的指针
}