几天前我参加了C++考试,我得到了这个问题,我发现我不太清楚,问题是:
解释多态性、虚拟功能和覆盖等术语之间的差异。通过实例获取矩形和三角形的形状面积,编写两个不同的代码片段,说明多态性的实现以及多态和虚拟函数的实现。 给出两个代码段的输出示例。
根据绝对C++ 5 p669,多态性的定义是:
多态是指通过后期绑定机制将多个意义关联到一个函数名的能力。因此,多态、后期绑定和虚拟函数实际上都是同一个主题。
我可以从这个定义中了解到,如果不使用虚拟函数,就不存在多态性,不是吗?所以这个问题没有两种不同的代码片段实现,对吗?只有一个使用虚拟函数
我的问题是:这是一个有效的问题吗?
发布于 2016-01-29 19:57:40
我的问题是:这是一个有效的问题吗?
不,这并不是关于“只有虚拟函数才能在c++中提供多态性”的预期答案。这个问题过于狭隘,而且具有误导性。
多态是指通过后期绑定机制将多个意义关联到一个函数名的能力。因此,多态、后期绑定和虚拟函数实际上都是相同的主题。我可以从这个定义中了解到,如果不使用虚拟函数,就不存在多态性,不是吗?
实际上,如果没有virtual
函数,您就可以具有多态性。
它被称为静态多态性,查找CRTP模式和SFINAE。
后期绑定的重点实际上缩小了动态多态性和(纯) virtual
函数的问题。但IMHO考试仍是一次糟糕的考试,题目过于狭窄/不明确。
发布于 2016-01-29 20:05:05
多态性是一个非常抽象的术语,表示CS/CP中的三项内容:
在OOP 中,重写是在子类型中重新定义以前在超级类型中定义的函数的能力。
在C++中,虚拟函数成员是允许子类型多态性在该类型的所有子类型上操作的方法的限定条件。
class A { // A is a polymorphic type (aka contains virtual function)
public:
virtual void f() { cout << "A::f()" << endl; } // virtual for polymorphism
};
class B : public A { // public is necessary to obtain subtyping
public:
virtual void f() { cout << "B::f()" << endl; } // overriding
};
...
void func(A &a) { // polymorphism can be obtain either on pointers or references types
a.f(); // polymorphic call, no one can say what will happens here, at least no more than "some function f will be called"
}
...
A a;
B b;
func(a); // guess what will be printed
func(b); // guess what will be printed
...
https://stackoverflow.com/questions/35092873
复制相似问题