如何获取基本指针以实例化派生对象并使用其功能?有没有一种方法可以像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;
}
}
解决步骤。
main
和cBase
类的声明之后移动cDerived
函数,或在main
之前向前声明这些类。 pBase.printMe()
更改为pBase->printMe()
。由于pBase
是一个指针,因此在访问其成员之前必须先取消引用它。 pBase->printMe()
就像(*pBase).printMe()
的简写加上其他一些家政服务。删除
pBase
对象,由于要使用指向基类(cDerived
)的指针删除派生类(cBase
),因此必须将基类的析构函数声明为虚拟,否则当您确实需要删除cBase
时将调用pBase
析构函数。在这里调用cDerived
析构函数。