C++ 在将基类作为参数传递给虚拟函数时避免动态_强制转换

C++ 在将基类作为参数传递给虚拟函数时避免动态_强制转换,c++,inheritance,derived-class,virtual-functions,dynamic-cast,C++,Inheritance,Derived Class,Virtual Functions,Dynamic Cast,对于这个简单但重要的案件,我找不到确切的答案。(如果有人能给我一个答案,我将不胜感激) 假设我有两种继承:类A是类B的基类,类C是类D的基类,并且做额外的工作(知道它实际上是指向D的指针) 现在让我们假设类A有一个虚拟函数'foo',它以指向C的指针作为参数。我想实现的是,每当A调用'foo',它的行为就好像它得到了指向C的指针,每当B调用foo,它的行为就好像它得到了指向d的指针 编译器允许我传递一个初始化如下的对象:C*C=newd(),但在“foo”中,据我所知,如果不使用dynamic_

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

假设我有两种继承:类A是类B的基类,类C是类D的基类,并且做额外的工作(知道它实际上是指向D的指针)

现在让我们假设类A有一个虚拟函数'foo',它以指向C的指针作为参数。我想实现的是,每当A调用'foo',它的行为就好像它得到了指向C的指针,每当B调用foo,它的行为就好像它得到了指向d的指针

编译器允许我传递一个初始化如下的对象:C*C=newd(),但在“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,但我想不出其他方法来实现我想要的

我很想听到一些报价-也许会如何改变设计,甚至“动态演员是必要的”都可以

我希望我能把我的观点说清楚,如果不是的话,我会澄清我的问题

更新:也许我以前应该提到它(b.t.w我不只是编造这个,实际上我在大学里必须编写类似的程序),但是第五个类,比如说E,将包含一个a类型的数组(或列表或其他),我有一个迭代这个数组的算法 其中的每个元素都应该调用这个“foo”方法——如果类实际上是A*,它应该像以前一样运行,如果是B*,它应该执行类B的“foo”

大概是这样的:

//within class E
A** arrayOfAs; //(and B's)
for (int i = 0 ; i < lengthOfArray ; ++i ) 
{
    arrayOfAs[i]->foo(/*someObject*/);
}
//在类E中
A**arrayOfAs//(及乙)
对于(int i=0;ifoo(/*someObject*/);
}

谢谢

要想做你想做的事,你需要在
B::foo
中进行
dynamic\u cast
。 但是如果只能使用
D
调用
B::foo
,则函数 不应该过载
A::foo
。这样做违反了LSP,并且更多或更多
less违背了面向对象代码的目的

你意识到你在使用私有继承吗?这里不能有LSP。“通过基类时避免动态施法…”选择一个更好的设计,问题已经解决了。。。