答: 虚函数可以实现多态。 编译器将为实现了虚函数的基类和覆盖了虚函数的派生类分别创建一个虚函数表(Virtual Function Table,VFT)。也就是说Base和Derived类都将有自己的虚函数表。实例化这些类的对象时,将创建一个隐藏的指针VFT*,它指向相应的VFT。可将VFT视为一个包含函数指针的静态数组,其中每个指针都指向相应的虚函数。
答: 可能有基类指针,指向的确是派生类成员的情况。 如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。
答:1.内联函数:不能为虚函数 因为内联函数是在编译期展开的,而虚函数是在运行时确定的。如果一个声明为内联函数的函数在虚表中,这证明编译器在编译时忽略了让函数内联的请求,将内联函数以普通函数处理了。 2.构造函数:不能为虚函数 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。 3.静态成员函数:不能 因为静态成员函数是属于类的,而虚函数是属于对象的。
答:构造函数可以调用虚函数,但是不建议。 在基类构造的时候,虚函数是非虚的: 当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中积累部分,子类还没有构造,没有初始化,如果在基类构造函数中使用虚函数,就是在调用一个还没有初始化的对象。所以C++是不可以在构造父类对象部分的时候调用子类的虚函数实现。
答:不要 在析构的时候会首先调用子类的析构函数,析构掉对象的子类部分,然后调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数。这是很危险的。
答:作用: 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。 这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。 底层实现原理: 底层实现原理与编译器相关,一般通过虚基类指针实现,即各对象中只保存一份父类的对象,多继承时通过虚基类指针引用该公共对象,从而避免菱形继承中的二义性问题。
答: 不能,因为static修饰之后,变为静态成员函数,他是属于类本身,不属于那个类的对象。而const修饰的是类的成员函数
答:用可变参数列表,另外两种用 C 实现函数重载的方法可以是利用宏和预处理,以及函数指针,只不过具体的重载方式也要根据特定的应用场景来决定 如何实现 C 的函数重载
答:用C语言实现继承一般有2种方法:声明放在结构中,声明在结构外。另外还有一种方法是:用宏定义出C++ C语言面向对象编程(一):封装与继承 C语言面向对象编程(二):继承详解
答:通过函数指针 C语言面向对象编程(三):虚函数与多态
答:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放。