【发布时间】:2015-10-31 19:42:23
【问题描述】:
基类
class Base
{
public:
Base()=default;
virtual void f(){cout << "base class\n";}
virtual ~Base(){}
};
派生类
class Derive : public Base
{
public:
Derive()=default;
void f() override {cout << "derived class\n";}
};
主要功能
int main()
{
Base* bsd = new Base;
Derive* dru = new Derive;
if(Derive* drd=dynamic_cast<Derive*>(bsd)){
drd->f();
cout << "downcast successful\n";
}else{
cout << "downcast failed\n";
}
if(Base* bsu=dynamic_cast<Base*>(dru)){
bsu->f();
cout << "upcast successful\n";
}else{
cout << "upcast failed\n";
}
delete bsd;
delete dru;
}
事实证明向上转换工作正常,而向下转换失败。这样看来似乎有道理。如果派生类包含未在基类中声明的成员对象并且没有默认构造函数,那么在向下转换期间会发生什么?
此外,通过dynamic_cast创建的目标指针*drd(*bsd)指向与要转换的指针*bsu(*dru)相同的对象。所以删除一次就足够了。我们不会有一个悬空指针,对吧?
【问题讨论】:
-
静态转换驱动类而不是动态
标签: c++ dynamic-cast