同名隐藏和同名覆盖的区别
时间: 2023-08-10 08:24:40 浏览: 46
同名隐藏和同名覆盖都是指在类的继承中,派生类中定义了与基类同名的成员函数或变量的情况。它们的区别主要在于访问基类同名成员的方式和效果不同。
同名隐藏是指当派生类中定义了与基类同名的成员函数或变量时,基类同名成员就被隐藏了,即在派生类中无法直接访问基类同名成员。如果需要访问基类同名成员,可以通过作用域解析运算符 `::` 来访问,例如:
```cpp
class Base {
public:
int x;
void func();
};
class Derived : public Base {
public:
int x;
void func();
};
void Derived::func() {
// 在派生类中访问基类同名变量 x
Base::x = 1;
// 在派生类中访问基类同名函数 func
Base::func();
}
```
同名覆盖是指派生类中定义的同名成员函数或变量覆盖了基类同名成员,即派生类中的同名成员与基类同名成员具有相同的名称和类型,但是派生类中的同名成员会覆盖基类同名成员。例如:
```cpp
class Base {
public:
int x;
void func();
};
class Derived : public Base {
public:
int x;
void func();
};
void Derived::func() {
// 在派生类中访问派生类同名变量 x
x = 1;
// 在派生类中访问派生类同名函数 func
func();
}
```
在同名覆盖的情况下,如果需要访问基类同名成员,可以使用作用域解析运算符 `::` 显式地指明要访问基类同名成员,例如:
```cpp
void Derived::func() {
// 在派生类中访问基类同名变量 x
Base::x = 1;
// 在派生类中访问基类同名函数 func
Base::func();
}
```
总之,同名隐藏和同名覆盖都是继承中的重要概念,需要理解它们的区别和使用方式。