📜  C++ |虚函数|问题9(1)

📅  最后修改于: 2023-12-03 15:29:52.073000             🧑  作者: Mango

C++ | 虚函数 | 问题9

在C++中,虚函数是一种能够实现多态性的特殊函数。当在派生类中重新定义一个虚函数时,基类中的虚函数将自动成为虚函数,而派生类中的函数将成为覆盖基类中的虚函数。

然而,在使用虚函数时,我们需要注意一些问题,尤其是问题9:

问题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();       // 调用基类中的虚函数,但实际调用的是派生类中的覆盖函数
}

输出结果与上面的例子相同。