我是新手,我知道这是一个非常基本的概念,也可能是重复的.一旦构造函数被调用,它的相应析构函数是否必须被调用,这不是真的吗?[代码在Dev C++上运行]
class Base
    {
     public:
            Base() { cout<<"Base Constructor\n";}
            int b;
     ~Base() {cout << "Base Destructor\n"; }
    };
class Derived:public Base
{
 public:
        Derived() { cout<<"Derived Constructor\n";}
        int a;
 ~Derived() { cout<< "Derived Destructor\n"; }
}; 
int main () {
Base* b = new Derived;    
//Derived *b = new Derived;
 delete b;
    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
提供输出
Base Constructor
Derived Constructor
Base Destructor
Run Code Online (Sandbox Code Playgroud)
    您的代码具有未定义的行为.基类的析构函数必须virtual使以下内容具有已定义的行为.
Base* b = new Derived;    
delete b;
Run Code Online (Sandbox Code Playgroud)
从C++标准:
5.3.5删除
3在第一个备选(删除对象)中,如果操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为为未定义.
所以在你的情况下,静态类型是Base,动态类型是Derived.所以Base析构函数应该是:
virtual ~Base() {cout << "Base Destructor\n"; }
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           3672 次  |  
        
|   最近记录:  |