c++ - 使用虚方法的具体案例

标签 c++ virtual-functions

<分区>

我有以下返回“YXX”的代码。 我想知道为什么第二个打印显示“X”,而关键字 virtual 用于 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

关于c++ - 使用虚方法的具体案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892831/

相关文章:

c++ - 指向由库返回的包装数组的智能指针

c++ - C++ 基类在构造后存储 'this' 的值以供将来的虚拟调用安全吗?

c++ - C++中vtable查找的性能影响

c++ - 声明具有所有虚函数的类的对象

c++ - ubuntu 中是否有库的默认路径?

c++ - 在开始时使用所有可用数据构建大型(ish)无序集

java接口(interface)方法内联

C++ 继承 : virtual member needs redeclaring?

python - 将 C++ 行转换为 Python 3

c++ - 释放一对 vector 中对象的内存