多态和虚函数

本文通过实例详细解析了C++中多态的概念及其实现方式,包括虚函数的声明与使用,以及如何通过指针和引用实现动态绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看两个例子

class C
{
public:
	string toString()
	{
		return "class c";
	}
};

class B : public C
{
	string toString()
	{
		return "class B";
	}
};

class A : public B
{
	string toString()
	{
		return "class A";
	}
};


void displayObject(C p)
{
	cout<<.toString()<<endl;
}

int main()
{
	displayObject(A());
	displayObject(B());
	displayObject(C());
	
	system("pause");

	return 0;
}

输出结果如下:<p>class C</p><p>class C</p><p>class C</p>

    由于形参的类型是 C,因此,调用的总是 C 中定义的 toString 函数,三次函数调用的输出都是相同的结果。

    如果调用 displayObject(A()) 时 A 中定义的 toString() 被调用,如果调用如果调用 displayObject(B()) 时 B 中定义的 toString() 被调用, displayObject(C()) 时 C 中定义的 toString() 被调用,为了达到这个目标,只要使用虚函数和指针变量修改上面程序即可。

class C
{
public:
	virtual string toString()
	{
		return "class c";
	}
};

class B : public C
{
	string toString()
	{
		return "class B";
	}
};

class A : public B
{
	string toString()
	{
		return "class A";
	}
};


void displayObject(C *p)
{
	cout<<p->toString()<<endl;
}

int main()
{
	A a=A();
	B b=B();
	C c=C();

	displayObject(&a);
	displayObject(&b);
	displayObject(&c);
	
	system("pause");

	return 0;
}

输出结果为:
class A
class B
class C

    把 类 C 中的 toString() 定义为虚函数, displayObject() 里定义了一个类型为 C 的指针变量 P,当调用 displayObject(&a)时,对象 A() 的地址被传递给 p。调用 p->toStrinfg()时, c++会动态地确定使用哪个 toString()函数,由于 p 指向 类 A 的一个对象,A 中被定义的 toString() 被调用。
    在运行时确定调用哪个函数的能力称为 动态绑定(dynamic binding), 它还有一个更常用的名称----多态(polymorphism,源于希腊语,含义为“许多形式”),因为一个函数有多种实现。

    在c++中,在派生类中重定义一个虚函数,称为 函数覆盖。一个函数在基类中定义为虚函数,在派生类中自动的被认为是虚函数,不必在派生类的函数声明中加上关键字 Virtual


为使一个函数能动态绑定,需要做两件事:

(1)在基类中,函数必须被声明为虚函数

(2)函数中应用对象的变量必须包含对象的地址


上面 的程序是将对象的地址传递给一个指针,可将函数参数改为基类的应用类型

void displayObject(C &p)
{
	cout<<p.toString()<<endl;
}

int main()
{
	A a=A();
	B b=B();
	C c=C();

	displayObject(a);
	displayObject(b);
	displayObject(c);
	
	system("pause");

	return 0;
}

C++中的继承、多态虚函数是面向对象编程的重要概念。 继承是指一个类可以从另一个类继承属性方法。子类可以继承父类的公有成员保护成员,但不能继承私有成员。通过继承,子类可以重用父类的代码,并且可以添加自己的特定功能。继承可以实现代码的重用层次化的设计。 多态是指同一个函数可以根据不同的对象调用不同的实现。多态可以通过虚函数来实现。虚函数是在基类中声明为虚拟的函数,它可以在派生类中被重写。当通过基类指针或引用调用虚函数时,实际调用的是派生类中的实现。这样可以实现动态绑定,即在运行时确定调用的函数。 虚函数的原理是通过虚函数表来实现的。每个包含虚函数的类都有一个虚函数表,其中存储了虚函数的地址。当调用虚函数时,编译器会根据对象的类型在虚函数表中查找对应的函数地址并调用。 综上所述,C++中的继承、多态虚函数是实现面向对象编程的重要机制,它们可以提高代码的灵活性可扩展性。 #### 引用[.reference_title] - *1* *3* [C++多态虚函数虚函数表](https://blog.youkuaiyun.com/weixin_46053588/article/details/121231465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [c++多态虚函数表内部原理实战详解](https://blog.youkuaiyun.com/bitcarmanlee/article/details/124830241)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值