如何在多态中调用子对象的重载函数?

时间:2010-10-13 20:46:46

标签: c++ polymorphism derived-class

考虑以下简单的多态...

class Parent {
public:
    someFunc() { /* implementation A */ };
};

class Child : public Parent {
public:
    someFunc() { /* implementation B */ };
};

int main ()
{
    Parent* ptr;

    ptr = new Parent();
    ptr->someFunc();
    delete ptr;

    ptr = new Child();
    ptr->someFunc();
    delete ptr;

    return 0;
}

据我所知,在这两种情况下都会调用实现A.

如何调用someFunc的“派生最多”实现,具体取决于ptr的动态类型?

在我的真实代码中有许多子类型,因此使用dynamic_cast检查每个子类是不切实际的。

3 个答案:

答案 0 :(得分:4)

尝试:

class Parent 
{
    public:
         virtual someFunc() { /* implementation A */ };
       //^^^^^^^
};

虽然技术上不需要。
我总是觉得很好的风格也可以声明派生函数virtual:

class Child : public Parent 
{
    public:
        virtual someFunc() { /* implementation B */ };
};

与Java函数不同,默认情况下不是虚函数。

答案 1 :(得分:3)

声明someFunc虚拟。这将确保调用实际对象的实现,而不是实现,具体取决于指针类型。

但是,这会增加一些与创建VTABLE和虚拟函数调用速度相关的开销,但实质上是多态性。

答案 2 :(得分:2)

这里没有多态性!您的所有功能都不是virtual

如果您想要多态,请执行以下操作:

class Parent {
public:
    virtual someFunc() { /* implementation A */ };
};