从基类指针调用派生的类方法

Calling derived class method from base class pointer

本文关键字:类方法 派生 调用 基类 指针      更新时间:2023-10-16
//Parent.h
class Parent
{
public:
    virtual void foo() = 0;
};
//Child.h
class Child : public Parent
{
public:
    virtual void foo(){cout << "inside function foo()" << endl;}
    virtual void bar(){cout << "inside function bar()" << endl;};    
};
int main( int argc, char** argv ){
    Parent* pa = new Child;
    pa->foo();
    pa->bar(); //Error, class Parent have no member bar
    return 0;
}

除了将这些功能添加到Parent

外,我如何避免此错误

您可以将指针声明为儿童类型。您仍然能够将其传递到期望父母指针的功能。

其他解决方案涉及使用dynamic_cast<Child>(pa),尽管这通常被认为是不良设计需要的,因为它破坏了多态性应该完成的。

您可以使用static_cast或Dynamic_cast。用Dynamic_cast的示例:

if (Child* child = dynamic_cast<Child*>(pa))
    child->bar();

首先在课堂设计中更加小心避免此错误。

是的,您可以使用dynamic_caststatic_castBase指针施放为Derived指针,如果类型相关,则像在此相关。但是,让我们考虑一下。

Q:为什么使用多态性? A:为相似操作提供不同的行为,在运行时选择该行为。

多态性用于从该操作的配置中抽象操作的实现。例如,所有Shape s都有许多方面。多少方面取决于实际形状,但是我们不必知道哪种Shape是什么样的东西来问它有多少个方面。我们应该只问它。

Q:为什么通常需要使用dynamic_cast
A:因为基本指针不提供您需要的设施。

如果我们不必关心哪种 Shape某种对象才能执行我们需要的操作,那么为什么Shape接口不提供我们需要的任何设施?

当我们在设计某些东西时犯了一个错误时,就会发生这种情况。 Shape中的设施中没有足够的设施,或者某些特定的Shape子类试图做更多的事情。

这就是您在这里所做的。如果Parent在其上具有(publicbar()方法是没有意义的,那么Child也不有意义。如果Child具有bar方法确实有意义,那么Child实际上不是Parent,是吗?

也许bar应该是其他类别的方法。

首先,我们需要知道为什么编译器抱怨!如果有人告诉您修复程序,您将永远不会知道原因。首先了解原因。

您在编译过程中遇到错误。vTablevPtrearly binding期间没有出现图片。它在late binding中出现。基类没有条形方法,因此编译器抱怨您是基于未知的基类调用的方法。因此,您需要将其输入到派生的类指针中,以使early binding通过。我希望我对这个问题的理解是正确的。如果我错了,请纠正我。