【问题标题】:Calling derived class method from base class pointer从基类指针调用派生类方法
【发布时间】:2014-02-15 14:51:47
【问题描述】:
//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 类之外,我如何避免此错误

【问题讨论】:

标签: c++


【解决方案1】:

您可以使用 static 或 dynamic_cast。使用 dynamic_cast 的示例:

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

【讨论】:

    【解决方案2】:

    您可以将指针声明为子类型。您仍然可以将它传递给期望父指针的函数。

    其他解决方案涉及使用dynamic_cast&lt;Child&gt;(pa),尽管这通常被视为需要它的糟糕设计,因为它破坏了多态性应该实现的功能。

    【讨论】:

      【解决方案3】:

      您首先要在类设计中更加小心,从而避免此错误。

      是的,如果类型相关,您可以使用dynamic_caststatic_castBase 指针转换为Derived 指针,就像它们在这里一样。但是让我们考虑一下。

      问:为什么要使用多态? 答:为类似的操作提供不同的行为,其中行为是在运行时选择的。

      多态性用于从操作的provision中抽象出操作的实现。例如,所有Shapes 都有多个边。有多少边取决于实际的形状,但我们不必知道Shape 是什么东西才能问它有多少边。我们应该可以问它。

      问:为什么通常需要使用dynamic_cast
      答:因为基指针不提供您需要的功能。 p>

      如果我们不必关心某个对象是什么类型的Shape 以便对其执行我们需要的操作,那么为什么Shape 接口不提供我们需要的任何功能?

      当我们在设计某些东西时犯了错误时,就会发生这种情况。要么是 Shape 没有足够的或合适的设施,要么是某个特定的 Shape 子类试图做的比它应该做的更多。

      这就是你在这里所做的。如果 Parent 在其上使用 (public) bar() 方法没有意义,那么 Child 拥有它也不应该有意义。如果Child 在其上使用bar 方法确实有意义,那么Child 就不是真正的Parent,是吗?

      也许bar 应该是某个其他类中的方法。

      【讨论】:

        【解决方案4】:

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

        您在编译期间遇到错误。 vTablevPtrearly binding 期间不会出现。它出现在late binding 中。基类没有 bar 方法,所以编译器会抱怨基类调用的方法未知。因此,您需要将其类型转换为派生类指针,以便 early binding 被传递。我希望我对这个问题的理解是正确的。如果我错了,请纠正我。

        【讨论】:

          猜你喜欢
          • 2013-09-23
          • 1970-01-01
          • 1970-01-01
          • 2016-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-25
          相关资源
          最近更新 更多