2

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

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。

根据 ptr 的动态类型,如何调用 someFunc 的“最衍生”实现?

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

4

3 回答 3

4

尝试:

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

虽然技术上不需要。
我总是觉得将派生函数声明为 virtual 是一种很好的风格:

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

与 Java 不同,函数默认不是虚拟的。

于 2010-10-13T20:49:23.413 回答
3

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

然而,这会增加一些与创建 VTABLE 和较慢的虚函数调用相关的开销,但本质上就是多态性。

于 2010-10-13T20:49:21.697 回答
2

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

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

class Parent {
public:
    virtual someFunc() { /* implementation A */ };
};
于 2010-10-13T20:50:20.117 回答