#include <iostream>
class A {
public:
virtual void f() { std::cout << "A"; }
};
class B : public A {
public:
void f() { std::cout << "B"; }
};
void g(A a)
{
a.f();
}
int main() {
B b;
g(b);
class A {
public:
virtual void f() { std::cout << "A"; }
};
class B : public A {
public:
void f() { std::cout << "B"; }
};
void g(A a)
{
a.f();
}
int main() {
B b;
g(b);
}
答案:A
g(A a)传入一个类型为A的对象的值,而不是引用或指针。这就意味着A的拷贝构造函数被调用。(这和我们传入的对象类型是B没有关系),我们得到了一个全新的类型为A的对象,这就叫做切片。
如果void g(A a) 改为 void g(A &a) 或者传入指针, 结果是:B