c++虚函数和纯虚函数的几点说明

概念

虚函数

在类的成员函数定义前加 virtual 关键字,该函数将被作为虚函数。虚函数被继承后仍为虚函数。虚函数的在子类中可以被override(覆盖)、overload (重载 )

virtual string toString(){

}

纯虚函数

纯虚函数除了有virtual 关键字外,还令它等于0,以表为纯虚函数。拥有纯虚函数的类称为 抽象类 。抽象类不能被实例化。类的继承往往越往后越具体,相反地,越往祖先越抽象,以至于没法实例代,其实也根本没必要实例化。按照某本书上所说,之所以定义抽象类,是为了给以后的子类留下公共接口。我想有一定道理。

virtual string toString()=0;

一般地,我们不希望纯虚函数的构造函数暴露。所以我们把构造函数设为 protected

class test {
    int property1;
    int attribute2;
    virtual string toString() = 0;
protected:
    test() {}
    test(int p1, int p2) {
        property1 = p1;
        attribute2 = p2;
    }
};

纯虚函数被继承后为 虚函数 ,请看下例。我们并没有给类 sun 类中的 toString() 函数 virtual关键字却实现了多态*,可见其从test类中继承了的toString()函数为虚函数

#include<iostream>
#include<string>
using namespace std;
class test {
    virtual string toString() = 0;
};
struct child:test {
    string toString() {
        return "ccc";
    }
};
struct sun:child
{
    string toString() {
        return "sss";
    }
};
int main() {
    sun s;
    child* c;
    c = &s;
    cout<<c->toString()<<endl;
    system("pause");
}

结果:
outcome

注意

重载函数虽同名,但其实是不同的函数,我们让其中一种成为虚函数或者纯虚函数,其它的同名函数(如果其它的都不加virtual)并不会成为虚函数或者纯虚函数。在子类中,若重载了继承过来的虚函数,那么新的重载形式(即你的在子类中定义而在父类中没有的同名函数)的函数不会是虚函数。在此就不再实验,读者自证之。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值