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

📅  最后修改于: 2023-12-03 14:39:38.817000             🧑  作者: Mango

C++ | 虚函数 | 问题6

背景

在C++中,虚函数是为了实现运行时多态性而存在的一个重要概念。当在基类中声明一个函数为虚函数时,派生类可以重写该函数,且在运行时根据运行时类型执行相应的函数。

虚函数的实现需要将函数地址存储在虚函数表(VTable)中,每个对象的地址都有一个指向此VTable的指针。当调用虚函数时,会先查看对象的VTable,然后在表中查找对应的函数指针执行。

问题描述

在使用虚函数时,有一个常见的问题是:当一个派生类重写了一个基类的虚函数时,是否需要显式地声明虚函数?

回答

不需要。

当派生类重写基类的虚函数时,只需要在函数定义中使用virtual关键字,而不需要在函数声明中使用。这是因为派生类会自动继承基类的虚函数及其属性,包括虚性质,参数及返回类型等。

例如:

class Base {
public:
    virtual void show() {
        cout << "This is Base class." << endl;
    }
};

class Derived : public Base {
public:
    void show() {
        cout << "This is Derived class." << endl;
    }
};

在上述示例中,在基类中声明了一个虚函数show(),并在派生类中重写了该函数。需要注意的是,派生类中并没有显式地声明该函数为虚函数,但它仍然具有虚性质。

如果我们在派生类中显式地声明该函数为虚函数,结果是相同的:

class Base {
public:
    virtual void show() {
        cout << "This is Base class." << endl;
    }
};

class Derived : public Base {
public:
    virtual void show() {
        cout << "This is Derived class." << endl;
    }
};

在上述示例中,派生类中显式地声明了show()为虚函数,但结果与未显式声明相同。

因此,在派生类中重写基类的虚函数时,只需要在函数定义中使用virtual关键字即可,不需要显式声明。