MENU

C++:多态#1虚函数

• March 13, 2021 • Read: 513 • 高级语言,学习笔记

多态

虚函数

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

class base{
    public:
        virtual void fun(){//虚函数
            cout<<"test ok!"<<endl;
}
    //..
};

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

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

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 类对象(子类),这也是很自然的事情

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 未经授权禁止转载


Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment