对于这个简单但重要的案例,我找不到确切的答案。 (如果有人将我推荐给我,我将不胜感激)。

可以说我有两种继承:类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*/);
}

谢谢!

最佳答案

要执行您想要的操作,您需要在dynamic_cast中添加一个B::foo
但是...如果您只能用B::foo调用D,则该函数
不应重载A::foo。这样做违反了LSP,并且更多或
较少会破坏面向对象代码的目的。

关于c++ - 将基类作为参数传递给虚拟函数时,请避免dynamic_cast,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22763292/

10-09 17:15
查看更多