RT
//main.cpp
#include <iostream>
using namespace std;
#include "2.h"
void main()
{
b B;
B.~b();
}
//1.h
#include <iostream>
using namespace std;
class a
{
public:
virtual ~a()
{
cout<<"a被析构"<<endl;
}
};
//2.h
#include <iostream>
using namespace std;
#include "1.h "
class b:public a
{
public:
virtual ~b()
{
cout<<"b被析构"<<endl;
}
};
如何不显示“a被析构”?
...的成员函数同名同参数同返回只是父类里面是虚函数,子类没有虚函数限...
没有问题,这就是虚函数的作用,子类中可以override(重写)父类中的虚函数,给出子类自己的实现方法,子类中其实省略了父类函数声明前的virtual,子类中加上virtual也是没有问题的,可有可无。
c++11 新特性总结(一)——关键字篇
为了防止子类重写父类的虚函数,C++11引入了override关键字。在声明子类的虚函数时添加override可以避免不必要的问题,如手误写错函数名导致编译通过但运行时出错的情况。Final关键字用于声明类的特定函数不能被子类重写,为类的某个部分提供不可变性。在类的构造函数管理上,C++11提供了default关键字,用于...
什么时候一定要使用虚函数而不能使用纯虚函数,请举实例。
虚函数主要是用来定义一个函数,且允许这个函数调用的时候,在可能的情况下调用派生类重载的函数。举一个实例的话,就是析构函数。父类可以有一个析构函数来处理父类里面分配的内存之类的事情,派生类也有一个析构函数来处理派生类中的相关事情。于是这就无法使用纯虚函数了。
C++基类子类中,虚函数究竟是怎样判断该调用哪个函数的??
有虚函数时,每个对象的this指针都指向一个虚函数表(Virtual Table)的地址,这个表里存的就是虚函数的地址。编译的时候就决定了,普通函数调用时直接CALL这个函数的地址,而是虚函数时,是从这个虚表里取地址去调用的。
C++父类中声明了一个虚函数以后 是不是在子类 以及子类的子类中 都要...
基类声明虚函数只是提供一个接口,也就是实现多态的关键,子类基本都要继承的,如果有一个子类不需要实现这个函数,说明你的继承关系有问题,最好改变一下继承体系
C++父类中有纯虚函数,在子类的子类中也需要实现吗?
(1)在main函数中,假设有父类或者子类的实例对象,就须要有父类的虚函数的实现。(2)在main函数中,假设没有父类或者子类的实例对象,能够不实现父类的虚函数。(3)假设把虚函数写成纯虚函数,也就不须要实现了。也没不会发生上述讨论。子类中实现了,子子类就不用实现。子类没实现的话,子子类...
什么意思?此处去掉virtual会有同样的结果,但把父类的去掉就会不同
这个很简单,父类指针指向子类对象,调用的函数如果是非虚拟成员函数,就直接调用父类的,如果是虚拟的,就调用子类的,这就是虚函数的作用。
C++ 用子类定义的对象 怎么调用父类的成员函数?
不一定,要按继承方式分三种情况讨论。public继承:可以调用基类中被protected和public修饰的成员变量与成员函数。protected继承:可以调用基类中被public修饰的成员变量与成员函数。private继承:不可以调用基类中任何成员变量与成员函数。
c++ 构造函数里可以调用虚函数吗
显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不...
C++中是不是每个类(有虚函数)都对应一个virtual function table?
你理解的是对的,子类和父类各有一个虚函数表,并且虚函数指针也是指向各自的。子类先是从父类复制了一个虚函数表,如果子类对父类的虚函数进行了覆盖,则在子类的虚函数表将会用子类的函数地址覆盖父类的,如果没有覆盖,则还是使用父类的函数地址,这样就实现了多态。