虚方法仅适用于基类指针

lud*_*ger -1 c++ virtual-functions

下面是C++中虚拟函数最简单的例子:

#include <iostream>

class A {
public:
    virtual void f() {
        std::cout << "A";
    }
};

class B : public A {
public:
    void f() {
        std::cout << "B";
    }
};


int main() {
    {
        // calls f() in derived class
        A* a = new B();
        a->f();
    }
    {
        // calls f() in base class
        A a = B();
        a.f();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个程序的输出是BA.我期待它BB,即在任何情况下调用基类.为什么使用基类指针会有所不同?我没有在标准中找到解释.

Bar*_*zKP 7

这称为切片.A a = B();创建一个类型的副本A.关于其来源的所有信息都B被遗忘了.利用多态的唯一方法是通过引用或指针(或允许编译时多态的机制,例如模板或函数重载).