码迷,mamicode.com
首页 > 编程语言 > 详细

C++虚函数

时间:2020-05-17 21:50:10      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:元素   这一   虚函数   size   func   --   use   习惯   efault   

C++中有一种名字让人觉得十分怪异的函数---虚函数。这样的称谓无论在JAVA抑或是PYTHON里面都没有,那么C++中的虚函数究竟是干什么用的,我们又应该在什么样的情景下使用它呢?

虚函数通过关键字virtual 标识,也就是说,所有标识为virtual的函数均为虚函数。下面是一个例子:

1 class Base{
2 public:
3     Base()=default;
4     ~Base(){ std::cout<<"this object has been destoried!"<<std::endl;};
5     
6     virtual void printInfo(){
7         std::cout<<"for demo porpuse only"<<std::endl;          
8     }
9 }

在上面的例子中,在printInfo()函数前边加了关键字virtual,代表这个函数是虚函数,那么这个虚函数有什么用呢?换句话说,什么时候应该用它,而什么时候不应该用它呢?

实际上,上面的打印函数加不加virtual都可以实现打印功能,为了回答上面提出的什么时候应当输赢的问题,接着看一段代码:

 1 class Collection{
 2 private: 
 3             int size;
 4 public:
 5             virtual const int size()const{
 6                   return size;
 7             }    
 8 }
 9 
10 class vec: public Collection{
11 public:
12      const int size()const
13     {
14           //TODO: implement own size func.
15     }
16 }

在上面的代码中,示例姓地写了一个基类Collection然后写了一个vec类继承基类,在基类中将获取元素个数的函数修饰为virtual,目的在于子类可以重写此方法,实现子类中特有的一些定义,之所以这么做,主要目的是为了符合多数人编程习惯。因此在基类中,如果想要子类继承时允许重写一些方法,那么可以将这些方法用virtual修饰。

虚函数的作用不止是这样。我们知道在java里面有接口这一关键字interface, 但是C++中并没有这个关键字,那么怎么实现类似JAVA的接口功能呢?这时候纯虚函数就排上用场了,请看示例:

1 class Base{
2 public:
3     virtual int size()=0;
4 
5 }

在这一示例中,任何想要继承这一基类的子类,都必须重写size方法,这就跟JAVA里的接口功能非常一致了。

讲到这里似乎虚函数主要的功能说完了,但是别急,虚函数还有另一个用途!!

无论是C++也好JAVA也好,多态是一种均支持的技术,那么在使用多态的时候,C++中有什么要注意的地方呢?请看一个实例:

 1  class Base{
 2  public:
 3      ~Base(){
 4            std::cout<<"this is parent class object being printed!\n";
 5      }
 6     void printInfo(){
 7       std::cout<<"base class.\n";
 8     }
 9  }
10  class Child:public Base{
11  public:
12       ~Child(){
13           std::cout<<"this is child class object being printed!\n";
14      }
15     void printInfo(){
16       std::cout<<"child class.\n"
17     }
18 }
19  void printClass(Base* b){
20     b->printInfo();
21      std::cout<<"calling printClass func.\n";
22  }

 

当使用多态的时候,调用printClass方法可以执行,然而在子类与父类对象析构的时候,会发现只有父类的对象被析构,而子类对象的析构函数没有被调用。因此在此处,应当使用系函数修饰父类的析构函数。

实际上当我们写一个类,不确定是否会被继承时,均应当将该类的析构函数标识为virtual,以免出现内存泄漏。

C++虚函数

标签:元素   这一   虚函数   size   func   --   use   习惯   efault   

原文地址:https://www.cnblogs.com/thugf/p/12907065.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!