如何访问子实例

时间:2013-05-22 18:51:57

标签: c++ polymorphism

#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 个答案:

答案 0 :(得分:3)

通过一些重构和稍微不同的方法,您可以使用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;
}

这将输出“查看孩子”。没有virtual关键字的相同代码将输出“查看父级”。请注意,关键字只需要在父类中,但为了清楚起见,通常也在派生类中使用。

虚拟函数的Wikipedia article很好地解释了这种情况:

  

虚拟功能“迟到”解决。如果有问题的功能是   基类中的'virtual',是派生程度最高的类的实现   根据对象的实际类型调用函数   无论指针的声明类型如何,都可以引用   参考。如果它不是“虚拟”,则该方法“早期”解决   调用的函数是根据声明的类型选择的   指针或参考。

由于此处对象的实际类型是,因此即使指针为子的功能>父母类型。

答案 1 :(得分:0)

*(parent*)的类型为parent,因此被调用的方法为view(parent)。如果要调用view(child),则需要将指针强制转换为child*,然后才能传入...

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

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

编译器发现变量的类型为parent,因此它调用匹配方法。