C++虚函数
2021-01-19 17:12
标签:元素 这一 虚函数 size func -- use 习惯 efault C++中有一种名字让人觉得十分怪异的函数---虚函数。这样的称谓无论在JAVA抑或是PYTHON里面都没有,那么C++中的虚函数究竟是干什么用的,我们又应该在什么样的情景下使用它呢? 虚函数通过关键字virtual 标识,也就是说,所有标识为virtual的函数均为虚函数。下面是一个例子: 在上面的例子中,在printInfo()函数前边加了关键字virtual,代表这个函数是虚函数,那么这个虚函数有什么用呢?换句话说,什么时候应该用它,而什么时候不应该用它呢? 实际上,上面的打印函数加不加virtual都可以实现打印功能,为了回答上面提出的什么时候应当输赢的问题,接着看一段代码: 在上面的代码中,示例姓地写了一个基类Collection然后写了一个vec类继承基类,在基类中将获取元素个数的函数修饰为virtual,目的在于子类可以重写此方法,实现子类中特有的一些定义,之所以这么做,主要目的是为了符合多数人编程习惯。因此在基类中,如果想要子类继承时允许重写一些方法,那么可以将这些方法用virtual修饰。 虚函数的作用不止是这样。我们知道在java里面有接口这一关键字interface, 但是C++中并没有这个关键字,那么怎么实现类似JAVA的接口功能呢?这时候纯虚函数就排上用场了,请看示例: 在这一示例中,任何想要继承这一基类的子类,都必须重写size方法,这就跟JAVA里的接口功能非常一致了。 讲到这里似乎虚函数主要的功能说完了,但是别急,虚函数还有另一个用途!! 无论是C++也好JAVA也好,多态是一种均支持的技术,那么在使用多态的时候,C++中有什么要注意的地方呢?请看一个实例: 当使用多态的时候,调用printClass方法可以执行,然而在子类与父类对象析构的时候,会发现只有父类的对象被析构,而子类对象的析构函数没有被调用。因此在此处,应当使用系函数修饰父类的析构函数。 实际上当我们写一个类,不确定是否会被继承时,均应当将该类的析构函数标识为virtual,以免出现内存泄漏。 C++虚函数 标签:元素 这一 虚函数 size func -- use 习惯 efault 原文地址:https://www.cnblogs.com/thugf/p/12907065.html1 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 }
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 }
1 class Base{
2 public:
3 virtual int size()=0;
4
5 }
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 }