已采纳回答 / 男人海洋liu
你的问题怎么说呢?你想什么时候用就什么时候用。但是有一点要注意的是:允许将一个声明为指向基类的指针指向其公有派生类的对象,但是不能将一个声明为指向派生类的指针指向其基类的一个对象(把这句话读三遍,你就明白了)
2016-03-25
已采纳回答 / 浔無涯
dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。 对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。
2016-03-23
已采纳回答 / topband
肯定不是这样的。1、使用virtual会产生一个虚拟指针表,要维持这个表,便额外加大了系统的开销。2、也不是所有的成员函数都需要实现多态的,总有些函数实现的功能意义时固定的,比如说加减乘除3、虚继承无非是为了避免诸如菱形继承的情况,在我们构建类图的时候,就需要考虑到这些问题,如果能不用虚继承,就不用咯。综上,应该是能不用就不用,C++就是以号称节省资源,运行效率高的。如果在写程序的时候,使得消耗过多的系统资源,便失去了这门语言高效的意义了。那还不如直接用一些新兴的语言如GO,SCALA之类的了。
2016-03-09
已采纳回答 / flurry
IndexException() 可以类比new IndexException()实际上前者是抛出一个类,后者是申请一个类。从老师的视频中可以看到,该类是使用默认构造函数,即没有初始化参数。所以IndexException后加(),内无参数,如果有参数,那么()内应该填写相应初始化参数值。
2016-03-02
最赞回答 / qq_玲_3
Father *p_children = new Children(xxx) 是用父类指针指向子类对象,不是“使用父类对象实例化子类”。 eg:处理函数 Action(Animal *p);定义对象是用子类 Pig pig Horse horse...开始活动 Action(&pig) Action(&horse)... 这时只需传子类地址到Action函数,不必写区别处理Pig, Horse...的函数了。 大概思想如此,建议看看多态方面的内容...
2016-01-09
已采纳回答 / 张土土
首先flymatch函数不仅可以传入指针,还可以传入实例化对象。1、课程中为什么要传入flyable指针呢,是基于基类的引用和指针可以引用子类的对象这一原则,也就是说flyable *p 这个指针既可以引用bird也可以引用plan,这样做的好处后面会说到。2、那为什么不用flyable p 呢,是因为flyable是纯虚函数,flyable p就是实例化一个flyable的对象p。显而易见,纯虚函数是不能被实例化的,所以flyable p 是非法的。3、那可以传入什么样的实例化对象呢,bird和pla...
2016-01-08
已采纳回答 / charlie111
不行的,这是C++ 对 ABSTRACT FUNCTION 的标志。 就像在JAVA 的 CLASS里 要用 abstract void eat(); 来声明虚函数。
2015-12-31
已采纳回答 / 太阳雨下
不一定,如果是private权限的,就不会,其它情况会,这样就算不是虚函数也是一样的。子类继承父类,在创建类的时候就会有一个虚函数表的概念,如果子类没重写同名函数,子类的虚函数表关于该函数的入口地址就会指向父类的该函数的代码入口地址
2015-12-28
已采纳回答 / 太阳雨下
先说个函数指针的概念,每个类(除了空类,就是没有方法也没有属性的类)在创建的时候,就会生成一个虚函数表指针,这个指针与普通的指针一样,存的是函数的入口地址,这是在类生成的时候就建立的。下来说几种情况:父类实现了非virtual修饰的方法一,子类继承父类,子类没有再实现方法一,这样父类与子类的关于方法一在各自虚函数表中的地址是一样的,也就是子类可以直接用父类的方法,而不用再去实现;父类实现了非virtual修饰的方法一,子类继承父类,子类重写了方法一,这样子类的虚函数表的方法一的地址与父类的虚函数表的方法一...
2015-12-28