析构函数:如果基类指针被用来删除派生类对象,那么基类的析构函数需要被声明为虚函数,以确保派生类的析构函数能够被正确调用,从而避免资源泄露。 类型安全:向下转型(将基类指针转换为派生类指针)是不安全的,需要使用dynamic_cast进行类型检查,以避免将基类指针错误地转换为派生类指针。 5. (可选) 讨论多态在这种情况...
析构函数 通过子类对象的指针删除子类对象时,无论父类的析构函数是不是虚的,都会调用父类的析构函数。但是通过父类对象的指针(指向子类对象)删除对象时,如果父类的析构函数不是虚的,那么就不会调用子类的析构函数。所以为了保证正确性,要将会被派生的类的析构函数声明为虚的。 虚函数与默认参数 虚函数重载时...
通过基类指针在派生类对象上调用这个虚函数,实际调用的是这个虚函数的派生类版本。 回溯到“虚析构函数”的概念,如果基类指针指向一个派生类对象,析构函数不是虚函数的话,基类指针只能调用基类的析构函数,派生类中的一些内存可能无法释放,造成内存泄露。而把析构函数定义成虚函数,那么基类指针调用的将是派生类的析...
因此,将基类指针指向派⽣类对象是安全的。此时这个基类指针只能调⽤基类的成员函数。如果试图⽤基类指针调⽤派⽣类才具有的成员函数,编译器会报错。虚函数的出现可以解决这个问题。通过基类指针在派⽣类对象上调⽤这个虚函数,实际调⽤的是这个虚函数的派⽣类版本。回溯到“虚析构函数”的概念,如果...
pb->;func1()执行的是基类的func1函数,i= 10,然后调用func2()函数;这里的func2是虚函数,要往下派生类寻找,找到后执行派生类中的func2(),此时,i = 12; 最后执行...的,只是调用父类的析构函数,如果是virtual的析构函数,则先子类之后父类具体看例题:解释:A*a= new C();是调用父类的指针new一个子类...
您的代码有未定义的行为。基类的析构函数必须是virtual,这样才有定义的行为。
已明确说明对于delete[],如果通过指向基类的指针删除指向派生类的对象数组,即使有虚析构函数,也是UB。 gameloftyou < 11 改成这样就没问题了,不过我一般都是用容器保存基类指针。base **p = (base **)operator new[](sizeof(base *)*2);*p = new device;*(p+1) = new...
父类指针指向子类对象,而子类对象却经由父类指针被删除,当父类有个non-virtual析构函数是,就会引起灾难。 C++明确指出,当子类对象经由一个父类指针被删除,而该父类带有一个non-virtual析构函数,其结果未定义--实际执行时通常发生的是对象的derived成分没有被销毁。子类的析构函数也未能被执行。然而其base class...
和之前版本相⽐,基类的析构函数多了⼀个virtual关键字。这样就使得⽗类类型的指针可以调⽤⼦类的成员函数。虚拟函数就是为了对“如果你以⼀个基础类指针指向⼀个衍⽣类对象,那么通过该指针,你只能访问基础类定义的成员函数”这条规则反其道⽽⾏之的设计。如果你打算将某个类作为基类,那么⼀定...
和之前版本相比,基类的析构函数多了一个virtual关键字。这样就使得父类类型的指针可以调用子类的成员函数。虚拟函数就是为了对“如果你以一个基础类指针指向一个衍生类对象,那么通过该指针,你只能访问基础类定义的成员函数”这条规则反其道而行之的设计。如果你打算将某个类作为基类,那么一定要定义一个虚析构函数。