首页 > 解决方案 > c++ 类的方法中的虚拟是否会渗透到它的子级

问题描述

为什么在这个例子中会执行树底子类的方法呢?我认为虚拟只是意味着如果我通过类的指针执行方法,但实际上是指向子类的实例,它将执行子类的方法。但显然,如果任何父母将该方法定义为虚拟方法,它就会这样做。有人可以解释为什么会这样以及使用虚拟的最佳实践是什么?(我被教导将它放在所有重写基类虚拟方法的方法之前)这是代码:

#include <iostream>

class BaseClass
{
    public:
    virtual void myFunc()=0;
};
class Child1: public BaseClass
{
    public:
    void myFunc(){
        std::cout << "Child1\n";
    }
};
class Child2: public Child1
{
    public:
    void myFunc(){
        std::cout << "Child2\n";
    }
};

int main()
{
    Child1 c1;
    Child2 c2;
    Child1 * p = &c1;
    p->myFunc();
    p = & c2;
    p->myFunc();
    return 0;
}

这将打印“Child1”和“Child2”而不是“Child1”两次,就像没有虚拟一样。我需要做什么才能获得具有预期结果的虚拟方法?

标签: c++classinheritancepolymorphismvirtual

解决方案


这就是多态性的含义。

如果你有一个指向基类的指针(所谓的静态类型的指针),它被分配了一个指向派生类的指针(所谓的动态类型的指针),那么将在表中搜索虚函数实际指向的派生类中的虚函数指针。

在您的程序中,该类Child2是该类的派生类Child1

class Child2: public Child1
{
    //...
};

该类Child1是该类的基类Child2。该类覆盖其基类Child2的虚函数。myFuncChild1


推荐阅读