使用虚方法的具体案例
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
我有以下代码 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