前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++:多态#1虚函数

C++:多态#1虚函数

作者头像
字节星球Henry
发布2021-08-09 16:48:16
2670
发布2021-08-09 16:48:16
举报

多态

虚函数

虚函数的声明很简单,在成员函数声明处用 virtual 关键字标志即可,例如以下片段

代码语言:javascript
复制
class base{
    public:
        virtual void fun(){//虚函数
            cout<<"test ok!"<<endl;
}
    //..
};

作此声明后,若有子类继承于 base 基类,基类将会自动将 fun()的虚函数性质自动继承给子类,子类的 fun()虚函数关键字 virtual 可省略。

但如果基类与子类的虚函数仅仅是函数名相同,参数类型不同或返回类型不同,即使加上了关键字 virtual,编译器也不会对其进行滞后联编,如以下程序

代码语言:javascript
复制
class base{
    public:
        virtual void fn(int x){
            cout<<x<<"is ok!"<<endl;
}
};
class subClass:public base{
    public:
        virtual void fn(float x){
            cout<<x<<"is ok!"<<endl;
}
};

这样的虚函数是不恰当的,基类中的 void fn(int x)和子类中的 void fn(float x)显然是两个不同的函数,它们仅仅是同名函数重载,虽然 subClass 继承 base,但并没有实现多态的 fn(int x)函数,而是新增了一个自己的多态的 fn(float x)函数,为继承它的子类准备...

虚函数返回类型的例外

之前我提到如果基类与子类的虚函数仅仅是函数名相同,参数类型不同或返回类型不同,即使加上了关键字 virtual,编译器也不会对其进行滞后联编。

但有例外情况,两个函数参数形式相同,返回类型不同,基类中的虚函数返回基类指针或基类引用,子类中的虚函数则返回子类指针或子类引用,其同样构成多态,这很合理,一个函数可以处理 base 类对象(基类),也可以处理 subClass 类对象(子类),这也是很自然的事情

代码语言:javascript
复制
class base{
    virtual base* fn(){
        cout<<"it's ok!"<<endl;
        return this;
}
};
class subClass:public base{
    virtual subClass* fn(){
        cout<<"it's ok!"<<endl;
        return this;
}
};
虚函数的几大限制
  1. 只有成员函数才能是虚函数,因为虚函数仅适用于有继承关系的类对象。
  2. 静态成员函数不能为虚函数,因为静态成员不受限于单个对象。
  3. 内联函数不能为虚函数。
  4. 构造函数不能为虚函数。
  5. 析构函数可以是虚函数,从而适应基类与子类对象的异同。

编辑:Henry 2021-03-13 未经授权禁止转载

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 多态
    • 虚函数
      • 虚函数返回类型的例外
        • 虚函数的几大限制
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档