📅  最后修改于: 2023-12-03 15:29:52.073000             🧑  作者: Mango
在C++中,虚函数是一种能够实现多态性的特殊函数。当在派生类中重新定义一个虚函数时,基类中的虚函数将自动成为虚函数,而派生类中的函数将成为覆盖基类中的虚函数。
然而,在使用虚函数时,我们需要注意一些问题,尤其是问题9:
在C++中,调用虚函数有两种方法,一种是使用对象的指针或引用,另一种是使用类名和作用域解析运算符::
使用对象的指针或引用的方法非常简单,只需要将对象的指针或引用传递给函数即可:
class Shape {
public:
virtual void draw() {
cout << "Shape::draw()" << endl;
}
};
class Circle : public Shape {
public:
void draw() {
cout << "Circle::draw()" << endl;
}
};
int main() {
Shape s;
Circle c;
Shape* p = &c; // Circle对象的指针被转为指向Shape对象的指针
s.draw(); // 调用基类中的虚函数
c.draw(); // 调用派生类中的覆盖函数
p->draw(); // 调用基类中的虚函数,但实际调用的是派生类中的覆盖函数
}
输出结果为:
Shape::draw()
Circle::draw()
Circle::draw()
注意,使用类名和作用域解析运算符::调用虚函数时,必须使用基类指针或引用:
int main() {
Shape s;
Circle c;
Shape* p = &c; // Circle对象的指针被转为指向Shape对象的指针
s.Shape::draw(); // 调用基类中的虚函数
c.Circle::draw(); // 调用派生类中的覆盖函数
p->Shape::draw(); // 调用基类中的虚函数,但实际调用的是派生类中的覆盖函数
// p->Circle::draw(); // 错误:不能使用基类指针或引用调用派生类中的特定函数
}
输出结果与上面的例子相同。
当然,这里的“基类指针或引用”不是指只能指向基类对象的指针或引用,也可以指向派生类对象,只要派生类对象可以隐式转换为基类对象即可:
int main() {
Shape s;
Circle c;
Shape& r = c; // Circle对象被转为Shape对象的引用
s.draw(); // 调用基类中的虚函数
c.draw(); // 调用派生类中的覆盖函数
r.draw(); // 调用基类中的虚函数,但实际调用的是派生类中的覆盖函数
}
输出结果与上面的例子相同。