我已经创建了一个接口来抽象部分源代码以供以后的扩展。但是,如果我想使用某些特殊方法扩展派生类怎么办?
所以我在这里有界面:

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的目的。但是,通常可以通过更改设计来避免使用它。由于您给出了一个抽象的示例,因此很难判断您是否应该以不同的方式进行操作。

10-08 16:51