1.虚函数的代价

1)带有虚函数的每个类会产生一个虚函数表,用来存储虚成员函数的指针

2)带有虚函数的每个类都会有一个指向虚函数表的指针

3)不再是内敛函数,因为内敛函数可以在编译阶段进行替代,而虚函数表示等待,在运行阶段才能确定到达采用哪种函数,所以虚函数不是内敛函数

 

2.那些函数不能是虚函数?

1)构造函数:对象的虚函数表指针需要通过构造函数初始化

2)内联函数:内联函数可以在编译阶段进行函数体的替换,而虚函数需要在运行期间进行确定

3)静态函数:静态函数不属于对象而属于类,因为静态成员函数没有this指针,所以无法访问对象的虚表指针,也就

无法访问类的虚函数表,将静态函数设置成虚函数也就没有任何意义,所以c++语法不支持将静态函数设置成虚函数

4)友元函数:友元函数不属于类,也不能被继承,没有继承特性的函数没有虚函数的说法

5)类外的普通函数:类外普通函数不是类的成员函数,同样不具备继承特性,也就没有虚函数的说法

 

3.虚函数和纯虚函数的区别?

1)纯虚函数只有定义,没有实现,虚函数既有定义,又有实现

2)含有纯虚函数的类不能定义对象,含有虚函数的类可以定义对象

 

4.菱形继承的内存结构?如何解决菱形继承存在的问题?

#include <iostream>
using namespace std;

class A
{
    public:
    int x;
    virtual int getx()
    {
        return x;
    }
};
class B:public A{};
class C:public A{};

class D:public B,public C{};

int main()
{
    D d;
    //以下代码不会被任何编译器通过,因为存在菱形继承问题
    cout<<d.getx()<<endl;
}
View Code

相关文章: