注册 登录
编程论坛 C++教室

有关虚函数通过基类指针或基类引用实现动态多态性,求指教

Eliza 发布于 2013-07-20 17:16, 2743 次点击
示例37:阅读下面程序,写出输出结果。
#include <iostream>                                                   // 编译预处理命令
using namespace std;                                                               // 使用命名空间std

class A
{
public:
         virtual void Show1() const { cout << "A" << endl; }         // 输出信息
         void Show2() const { cout << "A" << endl; }                  // 输出信息
};

class B: public A
{
public:
         void Show1() const { cout << "B" << endl; }                  // 输出信息
         void Show2() const { cout << "B" << endl; }                  // 输出信息
};

void Fun1(A obj) { obj.Show1(); }                                             // 定义Fun1()                  
void Fun2(const A &obj) { obj.Show1(); }                           // 定义Fun2()

int main()                                                                                 // 主函数main()
{
         B obj;                                                                        // 定义对象
         A *p = &obj;                                                               // 指针
         p->Show1();                                                               // 输出信息
         p->Show2();                                                               // 输出信息
         Fun1(obj);                                                                        // 调用Fun1()
         Fun2(obj);                                                                        // 调用Fun2()
         
         return 0;                                                        // 返回值0, 返回操作系统
}
请问这程序是怎么理解的,我感觉很混乱,不好记住,求指教
9 回复
#2
yuccn2013-07-20 17:38
你是说面向对象的一个重大特点多态还是说什么?

要理解虚函数的虚表就行了
#3
Eliza2013-07-20 18:06
回复 2楼 yuccn
多态,关键不理解
#4
love云彩2013-07-20 19:46
要理解虚函数
#5
lzj125302013-07-20 20:44
虚函数,是C++ 执行期识别的基础。从父类继承的虚函数函数,在编译阶段是不会确定其指向。但是在运行的时候便会根据指针类型自行识别出相应的函数。这就是虚函数的好处,可以说虚函数就是面向对象的多态。 也是整个C++程序设计的重要组成。
#6
lzj125302013-07-20 20:49
多态,顾名思义就是多种形态。 比如说要绘制一个图形(抽象类),而长方形,三角形,五边形等都是继承自图形类。那么在图形类里面的绘图函数只能是一个概念而不能实际绘制出图形(因为无法确定是什么)。而在长方形类里面可以对图形类的绘图函数进行重写,以达到相应的绘图的目的。那么这个过程就是多态。 也是面向对象的过程,因对象不同而采用不同的实现方法,但是都是绘图。
#7
peach54602013-07-21 06:39
这段代码,哪里不理解?
指明?
#8
Eliza2013-07-21 17:14
回复 7楼 peach5460
void Fun2(const A &obj) { obj.Show1(); }

主函数中Fun2(obj);是调用基类还是派生类的Show1
#9
a7649340182013-07-21 19:52
应该是调用B类的show1吧,因为那obj引用的是类B的对象啊,而且show1是虚函数.
#10
peach54602013-08-03 17:01
Fun2(obj);
子类的
1