专业编程基础技术教程

网站首页 > 基础教程 正文

C++中虚函数相比非虚函数的优势 c++中虚函数的作用

ccvgpt 2024-11-12 09:53:41 基础教程 5 ℃

基类定义的某个方法,虽然不是虚函数,但它也可以在派生类重新定义实现,这不成功实现了基类用基类的实现,派生类用派生类的实现了吗?为什么要有虚函数?

问题

基类定义的某个方法,虽然不是虚函数,但它也可以在派生类重新定义实现(re-define),这不成功实现了基类用基类的实现,派生类用派生类的实现了吗?为什么要有虚函数?书本还说虚函数会有额外开销,所以是不是都用非虚函数更好?具体的:

C++中虚函数相比非虚函数的优势 c++中虚函数的作用

  1. virtual 函数应该在什么情况下用呢?
  2. 是不是 virtual 的函数都能用非 virtual 的函数替代?
  3. 所以,是不是 virtual 没什么用呢?

(注:问题略作修改,以更准确表达)

南老师回答

先看不使用虚函数的,错误的用法

class  会飞的家伙
{
public:
       void  fly()
       {cout <<  "我飞飞飞。"  <<  endl;  }
};

class  鸟 : public 会飞的家伙
{
public:
        void  fly()
         {cout <<  "我拍翅飞。"  <<  endl; }
};

class  火箭 : public 会飞的家伙
{
public:
        void  fly()
         {cout <<  "我喷气飞。"  <<  endl; }
};

void  test()
{
        vector<会飞的家伙 *> v;
        v.push_back(new 鸟);
        v.push_back(new 火箭);
        for(auto f  :  v)
        {
               f->fly();
        }
}

以上代码运行结果说明:fly 不是虚函数,结果屏幕输出全部是"我飞飞飞"。


正确的写法,用于虚函数

class 会飞的家伙
{
public:
    //更常用的写法是声明为纯虚析构
    //然后在cpp文件中却提供析构的实现。
    virtual ~会飞的家伙() {}
    virtual void fly() = 0;
};

class 鸟 : public 会飞的家伙
{
public:
    void fly()  override
    {cout << "我拍翅飞。" << endl; }
};

class 火箭 : public 会飞的家伙
{
public:
    void fly() override
    {cout << "我喷气飞。" << endl; }
};

void test()
{
    vector<会飞的家伙 *> v;
    v.push_back(new 鸟);
    v.push_back(new 火箭);

    for(auto f : v)
    {
         f->fly();
         delete f;
    }
}

了解更多首页-第2学堂

最近发表
标签列表