专业编程基础技术教程

网站首页 > 基础教程 正文

C++|一个简单实例和一张图深刻认识虚函数与运行时多态

ccvgpt 2024-11-12 09:54:45 基础教程 3 ℃

首先了解一下实现运行时多态的前提条件:

赋值兼容是动多态能够产生的前提。所谓赋值兼容顾名思义:不同类型的变量之间互相赋值的兼容现象。就像隐式类型转换一样,而对于父子类对象之间的赋值兼容是有严格规定的,只有在以下几种情况下才能赋值兼容:

C++|一个简单实例和一张图深刻认识虚函数与运行时多态

① 派生类的对象可以赋值给基类对象。

② 派生类的对象可以初始化基类的引用。

③ 派生类对象的地址可以赋给指向基类的指针

但是由于基类对象与基类引用的局限性,我们一般采用基类指针进行派生类对象的函数调用。

实现条件:

① 父类中有虚函数。

② 子类 override(覆写/覆盖)父类中的虚函数。

③ 通过己被子类对象赋值的父类指针或引用,调用共用接口。

简单小实例:

#include <iostream>
using namespace std;
class A {
public:
	A() : m_data1(0), m_data2(0) {}
	virtual void vfunc1() { cout << "A::vfunc1" << endl; };
 virtual void vfunc2() { cout << "A::vfunc2" << endl; };
 void func1() { cout << "A::func1" << endl; };
 void func2() { cout << "A::func2" << endl; };
private:
 int m_data1, m_data2;
};
class B : public A {
public:
	B() : A(), m_data3(0) {}
 virtual void vfunc1() { cout << "B::vfunc1" << endl; };
 void func1() { cout << "B::func1" << endl; };
private:
 int m_data3;
};
class C: public B {
public:
	C() : B(), m_data1(0), m_data4(0) {}
 virtual void vfunc2() { cout << "C::vfunc2" << endl; };
 void func2() { cout << "C::func2" << endl; };
private:
 int m_data1, m_data4;
};
int main()
{
 A *p;
	A aObject;
	p = &aObject;
	p->vfunc1();
	B bObject;
	p = &bObject;
	p->vfunc1();
	C cObject;
	p = &cObject;
	p->vfunc1();
	p->vfunc2();
	cObject.A::func1();
	aObject = static_cast<A>(bObject);//在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
	//在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
	aObject.vfunc1();
/*
	B* bp = &bObject;
	C* cp = &cObject;
	cp = static_cast<C*>(bp);//在类层次间进行上行转换(指针)时,dynamic_cast和static_cast的效果是一样的;
	//在进行下行转换(指针)时,dynamic_cast具有类型检查的功能,比static_cast更安全。
	cp->vfunc1(); //B::vfunc1
	dynamic_cast<C*>(bp);
	cp->vfunc1(); //B::vfunc1
*/
	system("pause");
	return 0;
}
/*
A::vfunc1
B::vfunc1
B::vfunc1
C::vfunc2
A::func1
A::vfunc1
*/

图解:

-End-

最近发表
标签列表