zoukankan      html  css  js  c++  java
  • 基类的析构函数不加virtual引起的异常

    #include <iostream>
    using namespace std;
    
    class Animal{
    public:
    	static int number;
        virtual void printCount()=0;
        Animal(){
            ++Animal::number;
        }
        virtual ~Animal(){    	//错误点
            --Animal::number;
        }
    };
    
    class Dog:public Animal{
    	
    public:
    	static int number;
        Dog(){
            ++Dog::number;
        }
        void printCount(){
            cout<< Dog::number<<endl;
        }
        ~Dog(){
            --Dog::number;
        }
    };
    
    class Cat:public Animal{
    	
    public:
    	static int number;
        Cat(){
            ++Cat::number;
        }
        void printCount(){
            cout<< Cat::number<<endl;
        }
        ~Cat(){
            --Cat::number;
        }
    };
    
    void print() {
        	cout <<
        	Animal::number << " animals in the zoo, "  
        	<< Dog::number << " of them are dogs, "    
        	<< Cat::number << " of them are cats"      
        	<< endl;
    }
    
    
    int Animal::number = 0;
    int Dog::number = 0; 
    int Cat::number = 0;
    int main() {
        print();  	// 0 0 0 
        Dog d1, d2; //
        Cat c1;
        print();	//3 2 1		动物 狗 猫 
        Dog* d3 = new Dog();   	//4 3 1 
        Animal* c2 = new Cat;	//5 3 2  	受错误点影响的语句(多态语句) 
        Cat* c3 = new Cat;		//6 3 3
        print();				//6 3 3 
        delete c3;				
        delete c2;				//有问题 	受错误点影响的语句 	
        delete d3;
        print();				// 3 2 2	受错误点影响的语句 
    
    }
    

    错误点
    1、不加virtual时程序的输出:


    2、加virtual时程序的输出:

    在这里插入图片描述
    3、造成两种不同输出的原因:
    参考《Effective C++》条款07:为多态基类声明virtual 析构函数 。

  • 相关阅读:
    人间故事馆话题:聊聊那些被骗经历,让其他人不再被骗
    路过的风景
    路过的风景
    上海最适合拍照的旅游地点
    Java EE (11)
    五、服务器端的局域网
    P1294 高手去散步 洛谷
    堆排序【模板】
    P3383 【模板】线性筛素数 洛谷
    P1516 青蛙的约会 洛谷
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764226.html
Copyright © 2011-2022 走看看