多态的实现有两个条件
一个是在派生类中重写父类的虚函数
另一个是用父类的指针或者引用调用重写的虚函数就可以实现多态
例如
class A
{
public:
virtual void print() {
cout << "A" << endl;
}
};
class B :public A
{
public:
virtual void print()
{
cout << "B" << endl;
}
};
int main()
{
A a;
B b;
A*p = &b;
p->print();
}
可以看到输出的结果是B
在没有传参的时候,如果在重写时有默认参数列表,那么父类函数上面的默认参数会传给子类上面的参数
class A
{
public:
virtual void print() {
cout << "A" << endl;
}
virtual void fun(int val = 10)
{
cout << val << endl;
}
};
class B :public A
{
public:
virtual void print()
{
cout << "B" << endl;
}
virtual void fun(int val = 100)
{
cout << val << endl;
}
};
int main()
{
A a;
B b;
A*p = &b;
p->fun();
}
当我们运行这段代码的时候会发现输出不是100 而是 10。
如果返回值是成父类子类的指针或者引用也可以完成重写
class A
{
public:
virtual const A* self()
{
return new A;
}
};
class B :public A
{
public:
virtual const B* self()
{
return new B;
}
};
上面这段代码也是构成重写的