C++ 多态(四)动态转换
Dynamic casting
概述
在处理多态性时,您经常会遇到这样的情况:您有一个指向基类的指针,但您希望访问只存在于派生类中的一些信息。
考虑以下程序:
#include <iostream>
#include <string>
class Base
{
protected:
int m_value;
public:
Base(int value): m_value(value)
{}
virtual ~Base(){};
};
class Derived : public Base
{
protected:
std::string m_name;
public:
Derived(int value, const std::string& name)
: Base(value), m_name(name)
{}
const std::string& getName() const
{
return m_name;
}
};
Base* getObject(bool bReturnDerived)
{
if (bReturnDerived)
return new Derived(1, "Apple");
else
return new Base(2);
}
int main()
{
Base *b = getObject(true);
// 只有一个Base指针,我们如何打印派生对象的名称在这里?
delete b;
return 0;
}
在这个程序中,函数 getObject() 总是返回一个 Base 指针,但该指针可能指向 Base 对象或派生对象。在指针指向派生对象的情况下,我们如何调用派生 ::getName()?
一种方法是向 Base 添加一个名为 getName() 的虚函数(这样我们就可以使用 Base 指针/引用来调用它,并让它动态解析为 Derived::getName())。但是如果你用 Base 指针/引用调用它它实际上指向一个 Base 对象,这个函数会返回什么? 没有任何有意义信息。此外,我们会用实际上只应该是派生类所关心的东西污染基类。
我们知道 C++ 将隐式地允许您将派生指针转换为基指针(实际上,getObject() 就是这样做的)。这个过程有时被称为上抛。但是,如果有一种方法可以将基指针转换回派生指针呢?然后,我们可以直接