C++ 的Virtual的用法

1.虚函数

类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就可以通过重写虚拟函数来实现对基类虚拟函数的覆盖。当基类Base的指针point指向派生类Derived的对象时,对point的print函数的调用实际上是调用了Derived的print函数而不是Base的print函数。这是面向对象中的多态性的体现

基类的函数调用如果有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

2.纯虚函数:

C++语言为我们提供了一种语法结构,通过它可以指明,一个虚拟函数只是提供了一个可被子类型改写的接口。但是,它本身并不能通过虚拟机制被调用。这就是纯虚拟函数(purevirtual function)。 纯虚拟函数的声明如下所示:

class Query {

public:

// 声明纯虚拟函数

virtual ostream& print( ostream&=cout ) const = 0;

// ...

};

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

包含一个或多个纯虚拟函数的类被编译器识别为抽象基类。抽象基类不能被实例化,一般用于继承。

3.虚拟继承(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继承而来的基类,

了解下概念,至于虚基类的初始化、以及虚继承体系的进一步继承问题暂不讨论。

(C++标准中(也是很自然的)选择在每一次继承子类中都必须书写初始化语句(因为每一次继承子类可能都会用来定义对象),而在最下层继承子类中实际执行初始化过程。所以上面在每一个继承类中都要书写初始化语句,但是在创建对象时,而仅 仅会在创建对象用的类构造函数中实际的执行初始化语句,其他的初始化语句都会被压制不调用。)

详见:http://www.cppblog.com/chemz/archive/2007/06/12/26135.html

原文链接: https://www.cnblogs.com/Yogurshine/archive/2013/01/10/2855654.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/75089

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午4:48
下一篇 2023年2月9日 下午4:48

相关推荐