函数重写:
父类中被重写的函数依然会继承给子类。
子类中重写的函数将覆盖父类中的函数。
通过作用域分辨符可以访问父类中的函数。
class Parent
{
public:
void print()
{
cout << "I'm Parent." << endl;
}
};
class Child : public Parent
{
public:
void print()
{
cout << "I'm Child." << endl;
}
};
void how_to_print(Parent* p)
{
p->print();
}
Child c;
Parent* p = &c;
c.Parent::print() // 调用父类函数
c.print() // 调用子类函数
p->print(); // 调用父类函数
但是在面向对象中期望的行为:
1).根据实际类型的对象判断如何调用重写函数
2) 父类指针(引用)指向
a.父类对象则调用父类中定义的函数
b.子类对象则调用子类中定义的函数重写
面向对象中多态的概念
C++直接支持多态的概念:
通过使用 virtual 关键字对多态进行支持。
被 virtual 声明的函数被重写后具有多态特性。
被 virtual 声明的函数叫做虚函数。
class Parent
{
public:
virtual void print()
{
cout << "I'm Parent." << endl;
}
};
class Child : public Parent
{
public:
void print()
{
cout << "I'm Child." << endl;
}
};
void how_to_print(Parent* p)
{
p->print(); // 展现多态的行为
}
int main()
{
Parent p;
Child c;
how_to_print(&p); // Expected to print: I'm Parent.
how_to_print(&c); // Expected to print: I'm Child.
return 0;
}
多态的意义
在程序运行过程中展现出动态的特性。
函数重写必需多态实现,否则没有意义。
多态是面向对象组件化程序设计的基础特性。
(后续高级语言上只要重写就自动成了虚函数,设计模式都是通过多态变着花样玩的)
小结
函数重写只可能发生在父类和子类之间。
virtual 关键字是 C++ 中支持多态的唯一方式。
被重写的虚函数可能表现多态特性。