对于c++中的强制转换,这里主要是讲解的是父类与子类之间的类型强制转换。对于以下的代码中,主要是父类Monkey和子类Man之间的成员函数的调用。
// 这是父类
class Monkey {
public:
// 定义一个纯虚函数
virtual void printFunc() {
qDebug()<<"我是猴子类的输出"<<endl;
}
};
// 这是子类
class Man:public Monkey {
public:
// 虚函数重写
void printFunc() override
{
qDebug()<<"我是人类的输出"<<endl;
}
// 独有的成员函数
void Func1()
{
qDebug() << "我是人类的独有的成员函数"<<endl;
}
};
int main()
{
Monkey* pman = new Man;
pman->printFunc();
}
首先是在父类中声明了纯虚函数printFunc,在声明时前面加上virtual,代表是纯虚函数。而对于子类中同样有一个同名的方法printFunc,并且在后面加上了override,代表这是对父类的虚函数的重写,而在这个子类中还有一个自己所独有的成员函数。首先声明一个父类的指针,但是这个指针指向的是子类对象。使用这个指针来调用printFunc函数的话,调用的是子类的虚函数输出,所以输出如下:
添加图片注释,不超过 140 字(可选)
但是如果说想要使用这个指针对子类的独有的成员函数直接调用的话,这里就出现了问题,不能够直接调用子类的独有成员函数Func1,而想要使用这个指针来调用Func1的话,就需要使用到类型强制转换。
((Man*)pman)->Fucn1();
这样就可以调用到了Func1这个子类的独有成员函数,括号内就是为了将父类的指针强制转换为子类的指针。
添加图片注释,不超过 140 字(可选)
但是对于这个强制转换,需要注意其实这个办法是不安全的。所以要想解决这个问题,就需要使用dynamic_cast来进行类型转换。
Man *pointM = dynamic_cast<Man *>(pman);
if(pointM) {
qDebug()<<"安全调用下:" ;
pointM->Func1();
}
而这也解决了直接强制转换时的不安全问题。