C++几个问题问题,解释一下
理解多态性的概念,任选下面4个问题中的2个回答。a)多态性如何使你能够进行“通用化”编程而不是“特殊化”编程?试说明“通用化”编程的主要优点。b)请讨论switch(包括...
理解多态性的概念,任选下面4个问题中的2个回答。
a) 多态性如何使你能够进行“通用化”编程而不是“特殊化”编程?试说明“通用化”编程的主要优点。
b) 请讨论switch(包括if.. else)逻辑编程存在的问题,解释多态性可以继承代替switch逻辑的主要原因。
c) 请说出动态绑定和静态绑定的不同之处,并解释virtual函数在动态绑定中的用法。
d) 请查阅相关资料,说明动态绑定的底层实现。(虚函数表) 展开
a) 多态性如何使你能够进行“通用化”编程而不是“特殊化”编程?试说明“通用化”编程的主要优点。
b) 请讨论switch(包括if.. else)逻辑编程存在的问题,解释多态性可以继承代替switch逻辑的主要原因。
c) 请说出动态绑定和静态绑定的不同之处,并解释virtual函数在动态绑定中的用法。
d) 请查阅相关资料,说明动态绑定的底层实现。(虚函数表) 展开
2个回答
展开全部
·a,多态的体现之一就是虚函数,也就是在父类中定义的虚函数,由子类来实现,相当于为所有的子类设置了一个上层接口,所有的子类必须要通用这一个行为,就打个比方
class 人{
virtual void 吃饭(五谷杂粮 食物){};
}
在这里定义了一个虚函数,那么所有的老人、小孩、妇女儿童、男人之类的凡是属于人这个概念的子类,都得实现“吃饭”这个动作,而不是吃屎之类的动作,这就体现了“通用化”。所谓不能“特殊化”就是说你实现“吃饭”这个动作,要传入一个参数——五谷杂粮,但是你不能传入其他的——例如:屎、人肉之类的类型,否则会报错。这就是不能“特殊化”。当然多态还有诸如函数的重载、函数的隐藏,多多少少也是反映这个。
·b,动态绑定,编译时绑定,通过对象调用。是属于C++的动态多态性。静态绑定,运行时绑定,通过地址实现,是C++的静态多态性。下面是例子。
/************************************************************************
* 动态绑定与静态绑定的用法
************************************************************************/
#include <iostream.h>
class CBase
{
public:
virtual int func() const //虚函数
{
cout<<"CBase function! ";
return 100;
}
};
class CDerive : public CBase
{
public:
int func() const //在派生类中重新定义虚函数
{
cout<<"CDerive function! ";
return 200;
}
};
void main()
{
CDerive obj1;
CBase* p1=&obj1;
CBase& p2=obj1;
CBase obj2;
obj1.func(); //静态绑定:调用对象本身(派生类CDerive对象)的 func 函数
p1->func(); //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数
p2.func(); //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数
obj2.func(); //静态绑定:调用对象本身(基类CBase对象)的函数
}
class 人{
virtual void 吃饭(五谷杂粮 食物){};
}
在这里定义了一个虚函数,那么所有的老人、小孩、妇女儿童、男人之类的凡是属于人这个概念的子类,都得实现“吃饭”这个动作,而不是吃屎之类的动作,这就体现了“通用化”。所谓不能“特殊化”就是说你实现“吃饭”这个动作,要传入一个参数——五谷杂粮,但是你不能传入其他的——例如:屎、人肉之类的类型,否则会报错。这就是不能“特殊化”。当然多态还有诸如函数的重载、函数的隐藏,多多少少也是反映这个。
·b,动态绑定,编译时绑定,通过对象调用。是属于C++的动态多态性。静态绑定,运行时绑定,通过地址实现,是C++的静态多态性。下面是例子。
/************************************************************************
* 动态绑定与静态绑定的用法
************************************************************************/
#include <iostream.h>
class CBase
{
public:
virtual int func() const //虚函数
{
cout<<"CBase function! ";
return 100;
}
};
class CDerive : public CBase
{
public:
int func() const //在派生类中重新定义虚函数
{
cout<<"CDerive function! ";
return 200;
}
};
void main()
{
CDerive obj1;
CBase* p1=&obj1;
CBase& p2=obj1;
CBase obj2;
obj1.func(); //静态绑定:调用对象本身(派生类CDerive对象)的 func 函数
p1->func(); //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数
p2.func(); //动态绑定:调用被引用对象所属类(派生类CDerive)的 func 函数
obj2.func(); //静态绑定:调用对象本身(基类CBase对象)的函数
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询