跳到主要内容

简述什么是虚函数?什么是抽象函数 ?

参考答案:

虚函数和抽象函数都是C++面向对象编程中的重要概念,它们主要用于实现多态性。以下是它们的详细解释:

虚函数(Virtual Function)

在C++中,如果一个类中的成员函数被声明为虚函数,那么它就可以被子类中的同名函数重写(override)。当使用基类的指针或引用来调用这个函数时,实际执行的是指针或引用所指向对象的相应类型的函数,这就是动态绑定或运行时多态。

例如:

class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() override {
        std::cout << "Derived::func()" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();
    basePtr->func();  // 输出 "Derived::func()"
    delete basePtr;
    return 0;
}

在上述代码中,Base类中的func函数被声明为虚函数,然后在Derived类中被重写。在main函数中,尽管basePtr是一个指向Base类的指针,但是调用func函数时,执行的是Derived类的func函数。

抽象函数(Abstract Function)

抽象函数是一种特殊的虚函数,它在基类中没有定义(只有声明),需要由派生类提供具体的实现。含有至少一个抽象函数的类被称为抽象类,抽象类不能被实例化。抽象函数通常用于定义接口,这些接口需要在派生类中被实现。

例如:

class AbstractBase {
public:
    virtual void abstractFunc() = 0;  // 抽象函数
};

class Derived : public AbstractBase {
public:
    void abstractFunc() override {
        std::cout << "Derived::abstractFunc()" << std::endl;
    }
};

在上述代码中,AbstractBase类中的abstractFunc函数是一个抽象函数,它在AbstractBase类中没有定义,需要在派生类Derived中被实现。由于AbstractBase类包含抽象函数,因此它不能被实例化。

需要注意的是,抽象函数一定是虚函数,但虚函数不一定是抽象函数。一个虚函数可以有定义,而抽象函数则没有定义。