cpp虚函数,基类命名指向子类实例必备佳选
Posted 飞凡可期
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp虚函数,基类命名指向子类实例必备佳选相关的知识,希望对你有一定的参考价值。
简单虚函数
//============================================================================
// Name : p1022VirtualDeconstructor.cpp
// Author : perfey
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
class Base
public:
Base()cout << "Conctructing Base!"<<endl;
virtual ~Base()cout << "Deconstructing Base!"<<endl;//多一个空格,virtual和~之间
;
class Derive: public Base
public:
Derive()cout << "Constructing Derive!"<<endl;
~ Derive()cout << "Deconstructing Derive!"<<endl;
/*
* 若是不加virtual,只输出构建base, Derive, 解构Base 三步,没有解构 derive? 这个有问题了
*
* */
;
int main()
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
Base *bptr = new Derive(); //父类指针指向之类实例;
delete bptr;
return 0;
结果
Conctructing Base!
Constructing Derive!
Deconstructing Derive!
Deconstructing Base!
(如果没有 tilde~前面那个virtual修饰,那么不会有Deconstructing Derive!这一句)
继续传递,继承下去
//============================================================================
// Name : p1022VirtualDeconstructor.cpp
// Author : perfey
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
class Base
public:
Base()cout << "Conctructing Base!"<<endl;
virtual ~Base()cout << "Deconstructing Base!"<<endl;//多一个空格,virtual和~之间
;
class Derive: public Base
public:
Derive()cout << "Constructing Derive!"<<endl;
~ Derive()cout << "Deconstructing Derive!"<<endl;
/*
* 若是不加virtual,只输出构建base, Derive, 解构Base 三步,没有解构 derive? 这个有问题了
*
* */
;
class Derive2: public Derive
public:
Derive2()cout << "Constructing DeriveSon!"<<endl;
~ Derive2()cout << "Deconstructing DeriveSon!"<<endl;
/*
* 若是不加virtual,只输出构建base, Derive, 解构Base 三步,没有解构 derive? 这个有问题了
*
* */
;
int main()
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
Base *bptr = new Derive2(); //父类指针指向之类实例;
delete bptr;
return 0;
结果
!!!Hello World!!!
Conctructing Base!
Constructing Derive!
Constructing DeriveSon!
Deconstructing DeriveSon!
Deconstructing Derive!
Deconstructing Base!
可以看到每一个子类都继承虚函数,都调用了Deconstructor这是预期的效果。
继续花样
//============================================================================
// Name : p1022VirtualDeconstructor.cpp
// Author : perfey
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
using namespace std;
class Base
public:
Base()cout << "Conctructing Base!"<<endl;
virtual ~Base()cout << "Deconstructing Base!"<<endl;//多一个空格,virtual和~之间
virtual void Eat() = 0; //纯需函数,无需在基类中实现,奇怪吧,类似interface中概念
;
class Derive: public Base
public:
Derive()cout << "Constructing Derive!"<<endl;
void Eat()override
cout <<" 我吃生肉,茹毛饮血!!"<<endl;
~ Derive()cout << "Deconstructing Derive!"<<endl;
;
/*
* 若是不加virtual,只输出构建base, Derive, 解构Base 三步,没有解构 derive? 这个有问题了
*
* */
class Derive2: public Derive
public:
Derive2()cout << "Constructing DeriveSon!"<<endl;
~ Derive2()cout << "Deconstructing DeriveSon!"<<endl;
void Eat()
cout <<" 我今晚大口吃肉!"<<endl;
;
int main()
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
Base *bptr = new Derive(); //父类指针指向之类实例;
bptr->Eat();
bptr = new Derive2();
bptr->Eat();
delete bptr;
return 0;
纯虚函数来结果
!!!Hello World!!!
Conctructing Base!
Constructing Derive!
我吃生肉,茹毛饮血!!
Conctructing Base!
Constructing Derive!
Constructing DeriveSon!
我今晚大口吃肉!
Deconstructing DeriveSon!
Deconstructing Derive!
Deconstructing Base!
以上是关于cpp虚函数,基类命名指向子类实例必备佳选的主要内容,如果未能解决你的问题,请参考以下文章