今天看书遇到了C++中比较难缠的概念,就是重载、覆盖和隐藏。如果只要区分重载和覆盖,相信应该没有什么难度,并且它们的界限还是比较清晰的。现在加上了隐藏,初次看这些概念还真是不好区分。下面总结一下它们之间的区别:
成员函数的
重载的特征有以下4点:
(1) 必需在相同的范围内,即在同一个类的内部;
(2) 函数名称相同;
(3) 函数的参数不相同;
(4) virtual关键字可选,即可以加上也可以不加上,不影响重载的发生。
覆盖是指派生类函数覆盖基类函数,它的特征有以下4点:
(1)必需在不同的范围中,即分别在派生类和基类中;
(2) 函数名称相同;
(3) 参数也必需相同;
(4) 基类函数必需有virtual关键字。
而隐藏行为则必需符合以下两条规则:
(1) 如果派生类的函数与基类的函数的名称相同,但是参数不同。此时,不管有无virtual关键字,基类的函数都会被派生类的同名函数隐藏;
(2) 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。这个时候基类的同名函数也会被隐藏。
下面Demo说明了覆盖和隐藏之间的区别
覆盖例子:
#include <iostream>
#include <cstdlib>
using namespace std;
class a
{
public :
void virtual hello()
{
cout<<"a hello()"<<endl;
}
void hello(int i)
{
cout<<"a.hello(i)"<<i<<endl;
}
};
class b: public a
{
public:
void hello()
{
cout<<"b hello()"<<endl;
}
void hello(int i) const
{
cout<<"b.hello(i)"<<i<<endl;
}
};
int main(int argc,char * args[])
{
{
a *aptr=new b;
aptr->hello();
b* bptr=new b;
bptr->hello();
delete aptr;
delete bptr;
}
system("pause");
return EXIT_SUCCESS;
}
上面的例子是覆盖,由于基类a中和派生类b中的hello函数的签名完全相同,而且基类a中有virtual关键字,所以基类a中的hello函数被派生类b中的hello函数所覆盖,因此具有多态的特性(只有覆盖才具有多态的特征)。
这段代码显示的结果为:
稍微改动上述代码,得到下面的例子:
#include <iostream>
#include <cstdlib>
using namespace std;
class a
{
public :
void hello()
{
cout<<"a hello()"<<endl;
}
void hello(int i)
{
cout<<"a.hello(i)"<<i<<endl;
}
};
class b: public a
{
public:
void hello() const
{
cout<<"b hello()"<<endl;
}
void hello(int i) const
{
cout<<"b.hello(i)"<<i<<endl;
}
};
int main(int argc,char * args[])
{
{
a *aptr=new b;
aptr->hello();
b* bptr=new b;
bptr->hello();
delete aptr;
delete bptr;
}
system("pause");
return EXIT_SUCCESS;
}
改动后代码运行的结果是:
- 大小: 16.3 KB
- 大小: 17.4 KB
分享到:
相关推荐
### 重载、覆盖和隐藏:面向对象编程中的三大概念 在面向对象编程中,类成员函数的重载(Overloading)、覆盖(Overriding)和隐藏(Hiding)是三个非常重要的概念,它们帮助程序员更好地管理和扩展代码。下面将...
C++ 中的函数重载、重写、重定义和重定向是四个常见的概念,但它们之间存在一定的区别和联系。下面我们将详细地讨论每个概念。 一、函数重载 函数重载是指在同一个类中定义多个同名的函数,但是这些函数的参数不同...
在C++编程语言中,重载(Overloading)、覆盖(Overriding)和隐藏(Hiding)是三个重要的概念,它们都是多态性(Polymorphism)的体现,但有着不同的特性和用途。以下是对这三个概念的详细说明: **函数重载...
### C++ 中重写、重载与重定义的区别 在 C++ 编程语言中,重写(Override)、重载(Overload)以及重定义(Redefine 或 Hide)是面向对象编程中非常重要的概念。这三个概念虽然在字面上相似,但它们在实际应用中的...
在C++编程语言中,重载、重写和重定义是三个重要的概念,它们涉及到函数的多态性和作用域。下面将详细讲解这三个概念,并通过示例代码进行说明。 1. 重载(Overload) 重载是指在同一个作用域内,可以定义多个同名...
函数隐藏和函数覆盖只会发生在基类和派生类之间。 函数隐藏是指派生类中函数与基类中的函数同名,但是这个函数在基类中并没有被定义为虚函数,这种情况就是函数的隐藏。 所谓隐藏是指使用常规的调用方法,派生类对象...
在C++编程语言中,类(Class)是构建复杂数据结构和实现面向对象编程的核心概念。下面将详细解释这些知识点: 1. 结构体(Struct):C++扩展了C语言的结构体,允许结构体包含函数,这使得结构体在C++中更接近类的...
30. 重载、覆盖和隐藏:重载在同一作用域内,不同参数列表的同名函数;覆盖发生在派生类中,相同名称和参数列表,但必须是`virtual`;隐藏是基类同名成员在派生类中被新的声明隐藏。 以上是C++面试中涉及的一些核心...
除了基础编程技巧,文档还涉及了C++的高级特性,如函数重载、成员函数的重载、覆盖与隐藏、参数的缺省值、运算符重载以及函数内联。这些高级特性是C++语言区别于其他语言的核心,灵活运用这些特性可以编写出更加优雅...
- **C与C++混合编程**:讨论了如何在同一项目中结合使用C和C++代码。 - **运算符重载**:介绍了如何为现有类型定义新的运算符行为。 - **内存管理**:讲解了手动管理内存的方法,包括动态分配和释放。 - **多重继承*...
- **Struct vs Class**:在 C++ 中,`struct` 和 `class` 本质上非常相似,它们都可以用来定义类,并且都可以包含数据成员和成员函数。两者的主要区别在于默认的访问控制级别不同: - `struct` 默认成员为 `public`...
第八章介绍了C++函数的高级特性,比如函数重载、成员函数的重载、覆盖与隐藏、参数的缺省值、运算符重载以及函数内联。这些都是C++相较于其他编程语言所特有的高级特性,能够帮助开发人员更高效地编写代码。 第九章...
面试中,C++的题目通常涉及其核心概念和技术,包括类、对象、面向对象编程思想、内存管理、构造函数、拷贝构造函数、析构函数、运算符重载、多态性、友元和访问控制等。 1. 面向对象的程序设计思想强调数据和操作...
这部分内容探讨了C++特有的高级功能,如函数重载、成员函数的重载与覆盖、运算符重载等,以及如何利用这些特性来提高代码的灵活性和复用性。 - **函数重载**:通过函数名相同而参数列表不同来实现多态。 - **成员...
8. **C++函数高级特性**:介绍函数重载、成员函数的重载、覆盖与隐藏、参数缺省值、运算符重载、函数内联等概念及其应用。 9. **类的构造函数、析构函数与赋值函数**:深入讲解构造函数与析构函数的起源、构造函数...
- **成员函数的重载、覆盖与隐藏**:明确这些概念的区别及其应用场景。 - **运算符重载**:掌握运算符重载的规则,使其更加符合直觉。 - **函数内联**:了解内联函数的优点和缺点,合理使用以提高性能。 #### 九、...