class A
{
public:
virtual void func1(int val = 1){ std::cout << "A->" << val << std::endl; }
private:
int _a;
};
class B : public A
{
public:
virtual void func1(int val){ std::cout << "B->" << val << std::endl; }
private:
int _b;
};
void f1(A* ptr)
{
ptr->func1();
}
void f2(A& ref)
{
ref.func1();
}
void f3(A obj)
{
obj.func1();
}
int main()
{
A aa;
B bb;
f1(&aa);
f1(&bb);
f2(aa);
f2(bb);
f3(aa);
f3(bb);
return 0;
}
我们都知道前两组可以实现多态,但最后一组为什么不能实现多态呢?
我们看一下见识窗口?
我们知道参数如果不是指针或者引用,会进行拷贝传参。子类对象赋值给父类对象,切片把子类中包含的父类成员变量的值拷贝过去,但是子类的虚表不会给拷贝过去,则函数中这个父类对象的虚表是父类的,所以无法实现多态。
而指针或者引用是直接指向子类对象,不会进行拷贝赋值,这样虚函数表是子类的虚函数表,故能实现多态。