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时,会直接调用父类析构函数,子类没有被调用。为了程序的正确运行,防止只析构基类而不析构派生类的状况发生,应当记住这个规范。

猜你喜欢

转载自blog.csdn.net/ch853199769/article/details/80309164
今日推荐