C++类的向上转型

#include
#include

class A
{
public:
 void myfunc()
 {
  printf("A myfunc!\n");
 }
 virtual void mytest()
 {
  printf("A mytest!\n");
 }
};

class B:public A
{
public:
 void myfunc()
 {
  printf("B myfunc!\n");
 }
 virtual void mytest()
 {
  printf("B mytest!\n");
 }
};

void main()
{
 class A *pAa=new A;
 class B *pBb=new B;
 class B Bb;
 pAa->myfunc();
 pAa->mytest();
 pAa = &Bb;
 pBb->myfunc();
 pBb->mytest();
 pAa->myfunc();
 pAa->mytest();
}

输出为

A myfunc!

A mytest!

B myfunc!

B mytest!

A myfunc!

B mytest!

类A的myfunc()为实函数,mytest()为虚函数;所以当pAa = &Bb后

pAa->myfunc();输出为  A myfunc!
 pAa->mytest();输出为  B mytest!

将派生类地址赋给基类指针是安全的,如:pAa = &Bb;,但将基类地址赋给派生类指针则是不安全的,如:pBb = pAa.

此处的new是必须的,用于创建对象.

若要在对象pBb中调用其基类A中的成员,可以用

pBb->A::myfunc();
pBb->A::mytest();

你可能感兴趣的:(C++类的向上转型)