为什么在导出隐藏基函数时使用虚函数?

时间:2014-01-18 12:21:20

标签: c++ polymorphism

所以继承我的代码:

#include <iostream>

class cBase
{
    public:
    void vf(int)
    {
        std::cout << "cBase\n";
    }
};

class cDerived : public cBase
{
    public:
    void vf(int)
    {
        std::cout << "cDerived\n";
    }
};

int main()
{
    cBase b;
    cDerived d;

    b.vf(0);
    d.vf(0);
}

此示例隐藏基类的函数vf()并调用派生类的vf()函数。下面是另一段代码:

#include <iostream>

class cBase
{
    public:
    virtual void vf(int)
    {
        std::cout << "cBase\n";
    }
};

class cDerived : public cBase
{
    public:
    void vf(int)
    {
        std::cout << "cDerived\n";
    }
};

int main()
{
    cBase b;
    cDerived d;

    b.vf(0);
    d.vf(0);
}

现在,派生类的vf()函数会覆盖花瓶类的vf()函数。

所以我的问题是:如果我可以用c ++的默认隐藏机制实现相同的结果,那么虚函数有什么意义呢?我错过了什么吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

要使多态性工作,您需要处理指针或引用。当您在既不是指针或引用的对象上使用点运算符时,也不会使用虚拟表来调用正确的虚函数。

要查看它是如何工作的,请动态创建派生对象,将其分配给基类指针并在其上调用函数。这将调用派生类的实现。

答案 1 :(得分:1)

virtual函数提供运行时多态性。您的对象不会显示运行时多态性,即使用相同编译时类型的相同代码可能会根据相关对象的运行时类型显示不同的行为。 E.g:

void f(CBase& x) {
    x.vf(0);
}

vfvirtualCBase,即使CBase::vf的运行时类型为x,也会调用CDerived