覆盖override和隐藏hide
覆盖
#include <iostream>
// 基类
class Base {
public:
virtual void display() { // 基类虚函数
std::cout << "Base class display" << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
void display() { // 未使用 override,但覆盖基类虚函数
std::cout << "Derived class display" << std::endl;
}
};
int main() {
Base* basePtr = new Derived(); // 基类指针指向派生类对象
basePtr->display(); // 调用派生类覆盖的函数
delete basePtr;
return 0;
}
子类中如果函数签名(函数名,参数)与基类的虚函数匹配上,就会在基类的名称空间执行覆盖。
使用 override 校验
类似于java的@overWrite,明确告诉编译器是覆盖基类虚函数,如果签名没匹配上,会报错
// 基类
class Base {
public:
virtual void display() { // 基类虚函数
std::cout << "Base class display" << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
void display() override { // 使用 override 关键字
std::cout << "Derived class display" << std::endl;
}
};
隐藏
#include <iostream>
// 基类
class Base {
public:
void display(int x) { // 基类函数
std::cout << "Base class display with int: "<< x << std::endl;
}
};
// 派生类
class Derived : public Base {
public:
void display() { // 隐藏基类 display(int)
std::cout << "Derived class display" << std::endl;
}
};
int main() {
Derived d;
d.display(); // 调用 Derived 类的 display 函数
// d.display(5); // 错误:基类的 display(int) 被隐藏
d.Base::display(5); // 通过作用域解析显式调用基类函数
return 0;
}
如果函数匹配不到基类的虚函数签名,就会新生成子类的名称域对基类名称域进行隐藏,之后调用的就是这个子类名称域的函数

浙公网安备 33010602011771号