我已经创建了一个接口来抽象部分源代码以供以后的扩展。但是,如果我想使用某些特殊方法扩展派生类怎么办?
所以我在这里有界面:
class virtualFoo
{
public:
virtual ~virtualFoo() { }
virtual void create() = 0;
virtual void initialize() = 0;
};
和一个带有额外方法的派生类:
class concreteFoo : public virtualFoo
{
public:
concreteFoo() { }
~concreteFoo() { }
virtual void create() { }
virtual void initialize() { }
void ownMethod() { }
};
因此,我尝试创建concreteFoo的实例,并尝试像这样调用
ownMethod
:void main()
{
virtualFoo* ptr = new concreteFoo();
concreteFoo* ptr2 = dynamic_cast<concreteFoo*>(ptr);
if(NULL != ptr2)
ptr2->ownMethod();
}
它有效,但并不是真正的优雅方法。如果我尝试直接使用
ptr->ownMethod();
,则编译器会抱怨此方法不是virtualFoo
的一部分。是否有机会不使用
dynamic_cast
来执行此操作?提前致谢!
最佳答案
这正是dynamic_cast
的目的。但是,通常可以通过更改设计来避免使用它。由于您给出了一个抽象的示例,因此很难判断您是否应该以不同的方式进行操作。