在C++中,派生类可以继承基类的成员函数和成员变量,但有时候我们可能想要在派生类中重新定义一个已经存在于基类中的函数,这就引入了重写、隐藏和覆盖的概念。本文将详细介绍这三个概念以及它们的使用方法。
1. 重写(Overriding)
重写是指在派生类中重新定义一个已经在基类中存在的成员函数。当派生类对象调用这个成员函数时,将执行派生类中的定义,而不是基类中的定义。重写可以通过在派生类中使用相同的函数原型来实现。
class Base {
public:
void print() {
std::cout << "This is the print function in Base class" << std::endl;
}
};
class Derived : public Base {
public:
void print() {
std::cout << "This is the print function in Derived class" << std::endl;
}
};
int main() {
Derived obj;
obj.print(); // 输出: This is the print function in Derived class
return 0;
}
在上述示例中,派生类Derived
重写了基类Base
的print
函数。当派生类对象obj
调用print
函数时,将执行派生类中的定义。
2. 隐藏(Hiding)
隐藏是指在派生类中定义了一个与基类中同名但不同参数的成员函数。当派生类对象调用这个同名函数时,将隐藏基类中的同名函数。
class Base {
public:
void print() {
std::cout << "This is the print function in Base class" << std::endl;
}
};
class Derived : public Base {
public:
void print(int num) {
std::cout << "This is the print function in Derived class with parameter: " << num << std::endl;
}
};
int main() {
Derived obj;
obj.print(10); // 输出: This is the print function in Derived class with parameter: 10
obj.print(); // 编译错误,Derived类中没有无参print函数可用
return 0;
}
在上述示例中,派生类Derived
隐藏了基类Base
中的print
函数。当派生类对象obj
调用print
函数时,必须提供一个整数参数,否则将报错。
3. 覆盖(Overloading)
覆盖是指派生类中的函数与基类中的函数在函数名、参数列表和返回值类型方面完全匹配。通过覆盖,在派生类对象中调用该函数时,将优先调用派生类中的定义,而不是基类中的定义。
class Base {
public:
virtual void print() {
std::cout << "This is the print function in Base class" << std::endl;
}
};
class Derived : public Base {
public:
void print() override { // 使用关键字override显式地表明这是一个覆盖函数
std::cout << "This is the print function in Derived class" << std::endl;
}
};
int main() {
Derived obj;
Base* basePtr = &obj;
basePtr->print(); // 输出: This is the print function in Derived class
return 0;
}
在上述示例中,派生类Derived
覆盖了基类Base
中的print
函数。通过使用关键字override
,明确表明这是一个覆盖函数。当使用基类指针指向派生类对象时,调用print
函数将执行派生类中的定义。
小结
重写、隐藏和覆盖是在C++中灵活使用继承的重要方法。通过合理地使用这些技术,我们可以根据具体需求重定义、隐藏或覆盖基类中的成员函数,使得派生类能够更好地适应自身的特定功能和行为。
希望本文对你理解C++中的重写、隐藏和覆盖提供了帮助。如果有任何疑问或建议,请随时留言。谢谢阅读!
本文来自极简博客,作者:魔法少女,转载请注明原文链接:C 重写、隐藏、覆盖