使用虚方法的具体案例

Specific case of using virtual method

我有以下代码 return "YXX"。 我想知道为什么第二个打印显示 'X' 而关键字 virtual 用于 class X。所以行 tab[0] = y1 将被设置为 tab[ 0] 作为 Y 对象并显示 'Y' 由于虚拟方法不是吗?

#include <iostream>

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

class Y : public X {
    void f() const { std::cout << "Y"; }
};

void print(const X &x) { x.f(); }

int main() {
    X tab[2];
    Y y1;
    tab[0] = y1;

    print(y1);
    print(tab[0]);
    print(tab[1]);
    std::cout << std::endl;
}

tab 是 X 对象的数组,因此当您将 Y 对象分配给 tab 的元素时,它会切掉 Y 部分,只剩下 X 部分。

现在,如果您将其更改为:

X * tab[2];
tab[0] = new X;
tab[1] = new Y;
print(*tab[0]);
print(*tab[1]);

它不会做任何切片,它会打印 XY