#include <iostream>
// 基类Shape
class Shape {
public:
// 虚函数draw,提供默认实现
virtual void draw() const {
std::cout << "Drawing a shape." << std::endl;
}
};
// 子类Triangle继承自Shape
class Triangle : public Shape {
public:
// 重写draw函数
void draw() const override {
std::cout << "Drawing a triangle." << std::endl;
}
};
// 子类Rectangle继承自Shape
class Rectangle : public Shape {
public:
// 重写draw函数
void draw() const override {
std::cout << "Drawing a rectangle." << std::endl;
}
};
int main() {
Shape* shapes[2];
shapes[0] = new Triangle();
shapes[1] = new Rectangle();
for (int i = 0; i < 2; ++i) {
shapes[i]->draw();
delete shapes[i];
}
return 0;
}
函数重载在类继承体系中可能遇到的问题及解决方法
- 问题:
- 隐藏问题:在子类中定义与基类同名但参数列表不同的函数时,会隐藏基类中的同名函数。例如,如果Triangle类定义了
void draw(int param)
,那么Triangle
对象将无法直接调用基类的void draw()
函数,即使在继承体系中看起来应该可以调用。
- 解决方法:
- 使用
using
声明:在子类中使用using
声明来引入基类中同名函数,使得在子类作用域中可以访问基类的同名函数。例如,在Triangle
类中添加using Shape::draw;
,这样Triangle
对象就可以调用基类的draw()
函数。
- 合理设计函数签名:确保在子类中定义新的函数时,仔细考虑函数签名,避免不经意地隐藏基类函数。同时,使用
override
关键字来明确标识重写基类虚函数,这样编译器可以帮助检测函数签名是否正确匹配基类虚函数,减少隐藏问题的发生。