2
#include<stdio.h>

class parent
{
public:
    parent()
    {
    }
};

class child : public parent
{
public:
    child()
    {
    }
};

class master
{
public:
    void view(parent a)
    {
        printf("view parent instances");
    }
    void view(child b)
    {
        printf("view child instances");
    }
};

int main()
{
    parent *ptr;
    master mymaster;

    ptr = new child;

    mymaster.view(*ptr);

    return 0;
}

输出:“查看父实例”我从父类创建一个指针。然后我将该指针声明为子类型。当我运行 mymaster.view(*ptr); ,这总是转到第一个视图函数(void view(parent a)),如何使它转到(void view(child b))。谢谢你

4

4 回答 4

4

通过一些重构和稍微不同的方法,您可以使用virtual函数。这使得在使用如下指针调用时可以使用派生类中的函数。

#include<stdio.h>

class parent
{
public:
    parent()
    {
    }
    virtual void view()
    {
      printf("View parent");
    }
};

class child : public parent
{
public:
    child()
    {
    }
    virtual void view()
    {
      printf("View child");
    }
};

class master
{
public:
    void view(parent *a)
    {
        a->view();
    }
};

int main()
{
    parent *ptr;
    master mymaster;
    ptr = new child;
    mymaster.view(ptr);
    return 0;
}

这将输出"View child"virtual没有关键字的相同代码将输出"View parent"。请注意,关键字只需要在父类中,但为了清楚起见,也经常在派生类中使用。

关于虚函数的维基百科文章很好地解释了这种情况:

虚函数被“延迟”解析。如果所讨论的函数是基类中的“虚拟”函数,则根据所引用对象的实际类型调用该函数的最派生类的实现,而不管指针或引用的声明类型如何。如果它不是'virtual',则方法'early'解析,并根据指针或引用的声明类型选择调用的函数。

由于这里对象的实际类型是child ,因此即使指针是parent类型,虚函数也会确保调用child的功能。

于 2013-05-22T18:58:38.373 回答
0

的类型*(parent*)parent,所以被调用的方法是view(parent)。如果要调用view(child),则需要child*在传递指针之前将指针转换为 a ,但是...

您正在向后使用 OOP。你没有定义多个知道如何使用每个特定类型的子类的方法,你定义了一个可以尊重父类提供的契约的方法,子类在内部做自己的事情。

于 2013-05-22T18:57:19.847 回答
0

ptr是指向parent对象的指针。如果要view(child)调用函数,则需要将child对象传递给函数调用。

或者,您可以将其转换为child指针

mymaster.view(*(child*)ptr);

但你最终可能会遇到各种其他问题。

于 2013-05-22T18:57:29.893 回答
0

编译器根据最佳选择决定匹配方法。

编译器看到变量的类型是parent,所以它调用了匹配方法。

于 2013-05-22T18:57:46.967 回答