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

时间:2014-01-24 14:49:29

标签: c++

//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

之外,我该如何避免此错误

4 个答案:

答案 0 :(得分:2)

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

其他解决方案涉及使用dynamic_cast<Child>(pa),虽然这通常被视为需要这样做的糟糕设计,因为它会破坏多态性应该完成的任务。

答案 1 :(得分:1)

您首先要在课程设计中更加小心,以避免此错误。

是的,如果类型相关,您可以使用dynamic_caststatic_cast向[{1}}指针投射Base指针,就像它们在这里一样。但让我们考虑一下。

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

Polymorphism用于从该操作的 provision 中抽象出操作的实现。例如,所有Derived都有许多方面。多少边取决于实际的形状,但我们不应该知道什么样的Shape什么是为了问它有多少边。我们应该可以问它。

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

如果我们不应该关心某个对象是什么类型dynamic_cast以便执行我们需要的操作,那么为什么Shape接口永远不会提供任何设施呢?需要?

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

这就是你在这里所做的。如果Shape对其采用{Parentpublic方法没有意义,那么bar()也没有意义。如果Child对其采用Child方法有意义,那么bar实际上不是Child,是吗?

也许Parent应该是其他课程中的方法。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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