如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,通过派生类对象或者在派生类的成员函数中使用该成员时,将使用派生类新增的成员,而不是基类的。
注意:基类的成员函数和派生类的成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数。
类是一种作用域,每个类都有它自己的作用域,在这个作用域之内定义成员。
在类的作用域之外,普通的成员只能通过对象(可以是对象本身,也可以是对象指针或对象引用)来访问,静态成员可以通过对象访问,也可以通过类访问。
在成员名前面加类名和域解析符可以访问对象的成员。
如果不存在继承关系,类名和域解析符可以省略不写。
当存在继承关系时,基类的作用域嵌套在派生类的作用域中。如果成员在派生类的作用域中已经找到,就不会在基类作用域中继续查找;如果没有找到,则继续在基类作用域中查找。
如果在成员的前面加上类名和域解析符,就可以直接使用该作用域的成员。
#include <iostream>
class Base {
public:
int value;
void show() {
std::cout << "Base::show() - value: " << value << std::endl;
}
};
class Derived : public Base {
public:
int value; // 派生类成员变量,遮蔽基类成员变量
void show() {
std::cout << "Derived::show() - value: " << value << std::endl;
}
void display() {
std::cout << "In Derived::display()" << std::endl;
std::cout << "Derived class value: " << value << std::endl;
std::cout << "Base class value: " << Base::value << std::endl;
show(); // 调用Derived::show()
Base::show(); // 调用Base::show()
}
};
int main() {
Derived obj;
obj.value = 10; // 设置Derived类的value
obj.Base::value = 20; // 设置Base类的value
obj.display();
return 0;
}
运行结果:
In Derived::display()
Derived class value: 10
Base class value: 20
Derived::show() - value: 10
Base::show() - value: 20
解释:
Derived
类中的value
变量遮蔽了Base
类中的value
变量,因此在Derived
类的作用域内默认使用的是Derived
类的value
变量。- 在
display
函数中,通过Base::value
可以访问基类的value
变量,通过Base::show()
可以调用基类的show
函数。 - 默认情况下,调用的
show
函数是派生类中的show
函数,因为它遮蔽了基类的同名函数。
通过这个例子,你可以看到在派生类中重名成员和基类成员之间的关系以及如何访问这些成员。