【C++】多态

发布于:2025-02-10 ⋅ 阅读:(47) ⋅ 点赞:(0)

多态

        C++实现多态的前提条件,存在继承关系,子类重写父类虚函数,并且父类指针调用子类重写的虚函数;

        静态多态(编译时多态):函数重载(运算符重载),编译时可以确定的多态。

        动态多态:通过指针引用调用子类重写的虚函数,程序运行期间才能确定具体调用哪一  函数个虚函数。

        函数隐藏:子类中函数名和父类中函数名相同,子类对应函数会屏蔽父类同名函数。

        函数的覆盖发生在基类和子类中,并且两个函数完全相同(且为虚函数),否则为函数隐藏

C++多态的实现

        

#include<iostream>

using namespace std;
class father
{
public:
	void work()
	{
		cout << "father work" << endl;
	}
	virtual void fun()
	{
		cout << "father fun" << endl;
	}
	virtual void story()
	{
		cout << "father story" << endl;
	}
	virtual void inter(int n)
	{
		cout << "father inter" << endl;
	}
};

class son :public father
{
public:
	void work()
	{
		cout << "son work" << endl;
	}
	virtual void fun()
	{
		cout << "son fun" << endl;
	}
	void story()
	{
		cout << "son story" << endl;
	}
	virtual void inter(int n)
	{
		cout << "son inter" << endl;
	}
};
void happy(father* fath)
{
	fath->fun();//基类指针可以指向子类对象
}
int main()
{
	father* f = new son;
	f->fun();    //输出son fun
	f->work();    //输出father work
	f->story();    //输出son story(子类中的virtual省略,依然发生重写)
	son* S = new son;
	father& M = *S;    //引用
	M.work();    //输出father work
	M.inter(1);    //输出son inter
	son so;
	happy(&so);    //输出son fun
	return 0;
}
虚表指针与虚函数
class A
{
public:
	virtual void vfun1();//虚函数
    virtual void vfun2();
	void fun1();//普通函数
    void fun2();
};

class B :public A    //此时类B也有自己的虚表
{
};
  • 每个包含虚函数的类都有用来存放指针的数组(虚表),其中每一个元素对应该类的一个虚函数
  • 含虚函数类中的虚表,而非对象所有,一个类所有对象共用一个虚表,如果一个子类继承父类,父类若有虚函数,子类可调用父类的虚函数,子类也会有虚表。
  • 虚函数指针的赋值发生在编译器的编译阶段,在编译阶段虚表就构造出来了。
  • 为了让每个包含虚表的类对象都拥有一个虚表指针,编译器在类中添加了一个指针*_vptr用来指向虚表。这样,当类的对象在创建时便拥有了这个指针,且这个只针对值会自动被设置为指向该类的虚表

 

动态绑定
class A
{
public:
	virtual void vfunc1() {}
	virtual void vfunc2() {}
	void func1() {}
	void func2() {}
private:
	int m_data1, m_data2;
};

class B:public A
{
public:
	virtual void vfunc1() {}
	void func1() {}
private:
	int m_data3;
};

class C :public B
{
public:
	virtual void vfunc2() {}
	void func2() {}
private:
	int m_data1, m_data4;
};
静态类型和动态类型
静态绑定和动态绑定

虚析构

纯虚函数与抽象类


网站公告

今日签到

点亮在社区的每一天
去签到