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

一、抽象类

纯虚函数:在虚函数的后面写上 = 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 应用

jajajj

调试完程序后,在输出栏点击生成,程序中所有的虚表都将显示出来:

在这里插入图片描述
结束--------------------------------------------------------------------------------------------

下面这三段就是上边三个类中各自的虚表:

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>  	+---
发布了77 篇原创文章 · 获赞 16 · 访问量 6523

猜你喜欢

转载自blog.csdn.net/weixin_43886592/article/details/102864952