我创建了一个接口,用于抽取部分源代码以供以后扩展。但是如果我想用一些特殊方法扩展派生类呢? 所以我在这里有界面:
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
的情况下执行此操作?
提前致谢!
答案 0 :(得分:1)
这正是dynamic_cast
的用途。但是,您通常可以通过更改设计来避免使用它。既然你给出了一个抽象的例子,很难判断你是否应该以不同的方式做事。