Question #41
#include <iostream>
int main() {
std::cout << 1["ABC"];
}
B
根据 标准 规定 1["ABC"]
就等同于 *(1+"ABC")
根据加法运算可以交换,所以就等同于 *("ABC"+1)
即常见的"ABC"[1]
。
Question #27
#include <iostream>
struct A {
virtual std::ostream &put(std::ostream &o) const {
return o << 'A';
}
};
struct B : A {
virtual std::ostream &put(std::ostream &o) const {
return o << 'B';
}
};
std::ostream &operator<<(std::ostream &o, const A &a) {
return a.put(o);
}
int main() {
B b;
std::cout << b;
}
B
B类型通过虚函数重写了A类型的 put 函数。
对<<运算符进行了重载,重载之后对b进行<<操作会执行b的 put 函数输出“B”。
Question #44
#include <iostream>
struct X {
virtual void f() const { std::cout << "X"; }
};
struct Y : public X {
void f() const { std::cout << "Y"; }
};
void print(const X &x) { x.f(); }
int main() {
X arr[1];
Y y1;
arr[0] = y1;
print(y1);
print(arr[0]);
}
YX
arr[0] = y1
的操作使 Y 类型的对象被转化成 X 类型,这个过程会丢掉对象的 Y 部分。这个过程一般称作 slicing (切片)。
评论 (0)