C++ virtual关键字

虚函数

在类Base中加了Virtual关键字的函数就是虚拟函数。基类的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则还是调用基类的。

看下面的一段代码的输出结果:

class Base
{
public:Base(){}
public:
       virtual void print(){cout<<"Base";}
};

class Derived:public Base
{
public:Derived(){}
public:
       void print(){cout<<"Derived";}
};

int main()
{
       Base *point=new Derived();
       point->print();
}

Output:
Derived 

构造函数可以是虚函数吗?

不可以。虚函数指针是存放在对象内存中,一个对象在实例化(构造)前是没有内存的

虚拟函数衍生下去仍为虚拟函数,而且可以省略virtual 关键词 
virtual关键字修饰的方法在子类继承实现后,就可以达到多态的目的

纯虚函数

抽象类别中的虚拟函数不打算被调用,我们就不应该定义它,应该把它设为纯虚拟函数(在函数声明之后加上”=0” 即可)。

class Query {
public:
// 声明纯虚拟函数
virtual ostream& print( ostream&=cout ) const = 0;
// ...
};

这里函数声明后面紧跟赋值0。

类似Java抽象类的机制,即类本身不能实例化,其子类需要实现其所有抽象方法才能被实例化,C++提供了纯虚函数。在C++中,拥有纯虚函数的类不能被实例化,其子类也需要实现其所有纯虚函数才能被实例化。

包含一个或多个纯虚拟函数的类被编译器识别为抽象基类。抽象基类不能被实例化,一般用于继承。抽象基类只能作为子对象出现在后续的派生类中

虚拟继承(virtual public)

在多继承下,虚继承就是为了解决菱形继承中,B,C都继承了A,D继承了B,C,那么D关于 A的引用只有一次,而不是 普通继承的 对于A引用了两次……

格式:可以采用public、protected、private三种不同的继承关键字进行修饰,只要确保包含virtual就可以了。

class A
{
  void f1(){};
};
class B : public virtual  A{

 void f2(){};
};

虚继承:在继承定义中包含了virtual关键字的继承关系;
虚基类:在虚继承体系中的通过virtual继承而来的基类,

虚析构

当一个类拥有虚函数的时候,析构函数应当也被声明为virtual。

因为当使用多态时,父类的析构函数没有声明为virtual而调用delete时,会直接调用父类析构函数,子类没有被调用。为了程序的正确运行,防止只析构基类而不析构派生类的状况发生,应当记住这个规范。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

安德路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值