C++虚函数详解

文章介绍了C++中的虚函数概念,用于实现多态性。虚函数允许通过基类指针调用派生类的重定义函数。文章讨论了无意重写虚函数和签名不匹配的问题,强调了函数名、参数列表和const属性必须一致以正确重写虚函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虚函数定义

所谓虚函数就是在基类定义一个未实现的函数名,为了提高程序的可读性,虚函数都加上virtual关键字。一般格式:

class base
{
public:
 base();
 virtual void test(); //定义的一个虚函数
private:
 char *basePStr;
};

虚函数存在的意义:实现C++的多态。
虚函数使用的其核心目的是通过基类访问派生类定义的函数。

上述代码在基类中定义了一个test的虚函数,所有可以在其子类重新定义父类的做法这种行为成为覆盖(override),或者为重写。

 
#include<iostream>  
using namespace std;  
  
class A  
{  
public:  
    void foo()  
    {  
        printf("1\n");  
    }  
    virtual void fun()  
    {  
        printf("2\n");  
    }  
};  
class B : public A  
{  
public:  
    void foo()  //隐藏:派生类的函数屏蔽了与其同名的基类函数
    {  
        printf("3\n");  
    }  
    void fun()  //多态、覆盖
    {  
        printf("4\n");  
    }  
};  
int main(void)  
{  
    A a;  
    B b;  
    A *p = &a;  
    p->foo();  //输出1
    p->fun();  //输出2
    p = &b;  
    p->foo();  //取决于指针类型,输出1
    p->fun();  //取决于对象类型,输出4,体现了多态
    return 0;  
}

虚函数的常见错误

无意的重写

无意的重写 示例如下,在派生类中声明了一个与基类的某个虚函数具有相同的签名的成员函数,不小心重写了这个虚函数。

class Base {
public:
    virtual void Show(); // 虚函数
};
 
class Derived : public Base {
public:
    void Show(); // 无意的重写
};

虚函数签名不匹配

函数的签名包括:函数名,参数列表,const属性。

虚函数签名不匹配的错误通常是因为 函数名、参数列表 或 const 属性不一样,导致意外创建了一个新的虚函数,而不是重写一个已存在的虚函数。

class Base {
public:
    virtual void Show(int x); // 虚函数
};
 
class Derived : public Base {
public:
    virtual void Sh0w(int x); // o 写成了 0,新的虚函数 
    virtual void Show(double x); // 参数列表不一样,新的虚函数 
    virtual void Show(int x) const; // const 属性不一样,新的虚函数 
};

上述三种写法,编译器并不会报错,因为它不知道你的目的是重写虚函数,而是把它当成了新的虚函数。

注意:虚函数的继承是永久性的,也就是说父类声明某个函数为虚函数,在孙子类,孙子孙子类中也还是虚函数,仍然可以实现动态多态:根据实际指向的类型来选择执行的方法。不过为了可读性和意义明确,派生类也建议加上virtual关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月照银海似蛟龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值