一、抽象类
纯虚函数:在虚函数的后面写上 = 0 ,且不实现这个函数,则这个函数为纯虚函数。
抽象类:包含纯虚函数的类叫做抽象类(也叫接口类)。
1.抽象类不能实例化出对象,派生类继承后也不能实例化出对象。
2.只有重写纯虚函数,派生类才能实例化出对象。
3. 纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。
class Base //抽象类
{
public:
virtual void base() = 0;//纯虚函数
};
class Test:public Base
{
public:
virtual void base()
{
cout << "重写" << endl;
}
};
int main()
{
Test t;
t.base();
system("pause");
return 0;
}
二、虚表
有虚函数的类都存在一个自己的虚表。
class Base
{
public:
int m_a;
virtual void func()
{
cout << "Base::func"<<endl;
}
};
class TestBase:public Base
{
public:
int m_b;
virtual void func()
{
cout << "TestBase::func" << endl;
}
};
class Test :public TestBase
{
public:
int m_c;
virtual void func()
{
cout << "Test::func" << endl;
}
};
int main()
{
Test* T = new Test;
system("pause");
return 0;
}
引入-------------------------------------------------------------------------------------------------
这是一条vs2013中查看虚表的指令:
项目–>配置属性–>C/C++ -> 命令行 输入/d1 reportAllClassLayout
应用
调试完程序后,在输出栏点击生成,程序中所有的虚表都将显示出来:
结束--------------------------------------------------------------------------------------------
下面这三段就是上边三个类中各自的虚表:
1> class Base size(8):
1> +---
1> 0 | {vfptr}
1> 4 | m_a
1> +---
1> class TestBase size(12):
1> +---
1> | +--- (base class Base)
1> 0 | | {vfptr}
1> 4 | | m_a
1> | +---
1> 8 | m_b
1> +---
1> class Test size(16):
1> +---
1> | +--- (base class TestBase)
1> | | +--- (base class Base)
1> 0 | | | {vfptr}
1> 4 | | | m_a
1> | | +---
1> 8 | | m_b
1> | +---
1> 12 | m_c
1> +---