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

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的动态类型来称呼某些FUNC的“最派生”实现?

在我的真实代码中,有很多孩子类型,因此使用Dynamic_cast检查每个儿童课程是不切实际的。

有帮助吗?

解决方案

尝试:

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

虽然从技术上不需要。
我总是认为还可以声明派生函数虚拟的样式:

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

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

其他提示

宣布 someFunc 虚拟的。这将确保调用实际对象的实现,而不是根据指针类型的实现。

但是,这将增加与虚拟函数的VTable且较慢的呼唤相关的一定开销,但实际上是多态性的。

这里没有多态性!您的功能都没有 virtual.

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

class Parent {
public:
    virtual someFunc() { /* implementation A */ };
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top