繁体   English   中英

将基类作为参数传递给虚函数时,避免使用dynamic_cast

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM