#include <iostream>
class Parent
{
public:
void F() // 子类中有相同签名的函数时,称为重写(overwrite),
// 没有virtual关键字
{
std::cout << "Parent.F()" << std::endl;
}
virtual void G() // 带virtual关键字且子类中存在相同函数时,称为覆盖(override)
{
std::cout << "Parent.G()" << std::endl;
}
void H()
{
std::cout << "Parent.HHH()" << std::endl;
}
virtual void M()
{
std::cout << "Parent.M()" << std::endl;
}
};
class ChildOne : public Parent
{
public:
// 子类重写(overwrite)父类函数
void F()
{
std::cout << "ChildOne.F()" << std::endl;
}
// 子类覆盖父类虚函数,主要实现多态(virtual, override可以省略)
void G()
{
std::cout << "ChildOne.G()" << std::endl;
}
void H(int x) // 只要函数名相同,无论函数签名是否一致,父类的方法都将被隐藏
{
std::cout << "ChildOne.H(int)" << std::endl;
}
virtual void M()
{
std::cout << "ChildOne.M()" << std::endl;
}
void M(int x)
{
std::cout << "ChildOne.M(int x)" << std::endl;
}
};
int main()
{
ChildOne childOne; // = new ChildOne();
Parent *p = (Parent *)&childOne;
p->F(); // Parent.F()
p->G(); // 多态, ChildOne.G()
p->H();
//childOne.H(); // error: no matching function for call to ‘ChildOne::H()’
//note: candidate: ‘void ChildOne::H(int)’
//note: candidate expects 1 argument, 0 provided
childOne.H(2); // fine
//childOne.M(); // error: no matching function for call to ‘ChildOne::M()’, note: candidate: ‘void ChildOne::M(int)’
childOne.M(3); // fine
p->M(); // 说明子类中有因不同函数签名而发生的overwrite现象时,子类中与父类相同签名的函数仍然可以override【即多态不受影响】
//p->M(2); // error: no matching function for call to ‘Parent::M(int)’
//总结:子类函数的virtual关键字可以省略,因此子类函数中无需考虑virtual的存在
//只要子类中出现了与父类中同名但是不同函数签名的函数,子类都将覆盖父类的对应函数(即父类的该函数被隐藏),且无论父类中该函数是否有virtual关键字
return 0;
}