C++继承(继承性)---抽象类 虚表

mac2026-01-08  8

一、抽象类

纯虚函数:在虚函数的后面写上 = 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> +---
最新回复(0)