如何获取基本指针以实例化派生对象并使用其功能?有没有一种方法可以像java这样强制转换?
考虑以下示例代码:

int main(){
    cBase *pBase = 0;
    if (1 < 2)
    {
        pBase = new cDerived;
    }
}

class cBase
 {public:
     virtual void printMe()
          {
             std::cout << "printed cBase" << endl;
           }
};

class cDerived: public cBase
{public:
    virtual void printMe()
         {
            std:: cout << "printed cDerived" << endl;
          }
};

但是当我这样做时;它给我一个错误“表达式必须具有类类型”。
cBase *pBase = 0;
    if (1 < 2)
    {
        pBase = new cDerived;
        pBase.printMe();
    }

最佳答案

像这样修复它

#include <iostream>
using namespace std;

class cBase
 {
    public:
        virtual ~cBase() {};
        virtual void printMe()
        {
         std::cout << "printed cBase" << endl;
        }
};

class cDerived: public cBase
{public:
    virtual void printMe()
         {
            std:: cout << "printed cDerived" << endl;
          }
};

int main(){
    cBase *pBase = 0;
    if (1 < 2)
    {
        pBase = new cDerived;
        pBase->printMe();
        delete pBase;
    }
}

解决步骤。
  • maincBase类的声明之后移动cDerived函数,或在main之前向前声明这些类。
  • pBase.printMe()更改为pBase->printMe()。由于pBase是一个指针,因此在访问其成员之前必须先取消引用它。 pBase->printMe()就像(*pBase).printMe()的简写

  • 加上其他一些家政服务。删除pBase对象,由于要使用指向基类(cDerived)的指针删除派生类(cBase),因此必须将基类的析构函数声明为虚拟,否则当您确实需要删除cBase时将调用pBase析构函数。在这里调用cDerived析构函数。

    10-08 07:36