[英]Looking for a pattern to avoid using dynamic_cast in implementation of a virtual function
[英]Avoid dynamic_cast when passing base class as a param to a virtual function
对于这个简单但重要的案例,我找不到确切的答案。 (如果有人将我推荐给我,我将不胜感激)。
可以说我有两种继承:类A是类B的基类,类C是类D的基类,并做了很多工作(知道它实际上是指向D的指针)。
现在让我们说类A有一个虚函数'foo',它使用一个指向C的指针作为参数。我想实现的是,只要A调用'foo',它就好像它拥有一个指向C的指针一样,并且每当B调用foo时,它就好像获得了指向D的指针一样。
编译器将允许我传递一个初始化如下的对象: C * c = new D(); ,但据我所知,在'foo'中,没有办法说出如果不使用dynamic_cast我们实际上得到了一个指向D的指针。
这是我在想什么的草图:
class C {};
class D : C {// has more functions };
class A {
public:
virtual void foo (C* c) { //do something with c* };
};
class B : A {
public
virtual void foo (C* c) { // call A::foo()
//do something with c knowing that c* as actually a D*
}
};
为了实现我想要的,在B :: foo中使用dynamic_cast似乎是不可避免的。 我知道,一般而言,使用dynamic_cast可能会提示OOP设计不良,因为它可能违反LSP,但是我无法想到其他方法来实现我想要的功能。
我很想听听一些报价-也许一个人可以改变设计,甚至“ dynamic_cast是必需的”都可以。
我希望我能阐明我的观点,如果不是,我会澄清我的问题。
更新:也许我以前应该提过它(顺便说一句,我不仅要弥补这一点,我实际上还必须在大学里编写这样的东西),但是这个想法是,第五个类,比如说E将持有一个数组( (或列表等)类型,并且我有一个遍历此数组的算法,并且对于每个元素,它都应调用此“ foo”方法-如果类实际上是A *,则它应该像以前一样运行,如果是B *,则应执行类B的'foo'。
像这样:
//within class E
A** arrayOfAs; //(and B's)
for (int i = 0 ; i < lengthOfArray ; ++i )
{
arrayOfAs[i]->foo(/*someObject*/);
}
谢谢!
要执行所需的操作,您需要在B::foo
进行dynamic_cast
。 但是...如果只能用D
调用B::foo
,则该函数不应重载A::foo
。 这样做违反了LSP,并且或多或少地破坏了面向对象代码的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.