若派生类重写基类的虚函数,其函数参数是否都要保持一致? [问题点数:20分,结帖人xychzh]

Bbs1
本版专家分:92
结帖率 100%
Bbs9
本版专家分:58439
Blank
红花 2003年6月 C/C++大版内专家分月排行榜第一
2002年5月 C/C++大版内专家分月排行榜第一
Blank
黄花 2003年9月 C/C++大版内专家分月排行榜第二
2002年6月 C/C++大版内专家分月排行榜第二
2002年4月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2007年3月 C/C++大版内专家分月排行榜第三
2007年2月 C/C++大版内专家分月排行榜第三
2007年1月 C/C++大版内专家分月排行榜第三
2003年7月 C/C++大版内专家分月排行榜第三
Bbs1
本版专家分:92
Bbs9
本版专家分:86280
Blank
红花 2011年3月 C/C++大版内专家分月排行榜第一
2010年9月 C/C++大版内专家分月排行榜第一
Blank
黄花 2015年1月 C/C++大版内专家分月排行榜第二
2012年3月 C/C++大版内专家分月排行榜第二
2011年11月 C/C++大版内专家分月排行榜第二
2010年6月 C/C++大版内专家分月排行榜第二
2010年5月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2011年4月 C/C++大版内专家分月排行榜第三
2011年2月 C/C++大版内专家分月排行榜第三
2010年8月 C/C++大版内专家分月排行榜第三
Bbs9
本版专家分:58439
Blank
红花 2003年6月 C/C++大版内专家分月排行榜第一
2002年5月 C/C++大版内专家分月排行榜第一
Blank
黄花 2003年9月 C/C++大版内专家分月排行榜第二
2002年6月 C/C++大版内专家分月排行榜第二
2002年4月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2007年3月 C/C++大版内专家分月排行榜第三
2007年2月 C/C++大版内专家分月排行榜第三
2007年1月 C/C++大版内专家分月排行榜第三
2003年7月 C/C++大版内专家分月排行榜第三
Bbs1
本版专家分:92
Bbs9
本版专家分:58439
Blank
红花 2003年6月 C/C++大版内专家分月排行榜第一
2002年5月 C/C++大版内专家分月排行榜第一
Blank
黄花 2003年9月 C/C++大版内专家分月排行榜第二
2002年6月 C/C++大版内专家分月排行榜第二
2002年4月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2007年3月 C/C++大版内专家分月排行榜第三
2007年2月 C/C++大版内专家分月排行榜第三
2007年1月 C/C++大版内专家分月排行榜第三
2003年7月 C/C++大版内专家分月排行榜第三
Bbs1
本版专家分:92
Bbs9
本版专家分:58439
Blank
红花 2003年6月 C/C++大版内专家分月排行榜第一
2002年5月 C/C++大版内专家分月排行榜第一
Blank
黄花 2003年9月 C/C++大版内专家分月排行榜第二
2002年6月 C/C++大版内专家分月排行榜第二
2002年4月 C/C++大版内专家分月排行榜第二
Blank
蓝花 2007年3月 C/C++大版内专家分月排行榜第三
2007年2月 C/C++大版内专家分月排行榜第三
2007年1月 C/C++大版内专家分月排行榜第三
2003年7月 C/C++大版内专家分月排行榜第三
Bbs1
本版专家分:2
Bbs2
本版专家分:269
其他相关推荐
基类私有虚函数可被派生类重写
转自:http://my.oschina.net/acemumu/blog/139038?p={{currentPage+1}} 基类私有虚函数可被派生类重写基类的私有成员不可以被派生类访问,没想到可以重写基类虚函数,而且动态绑定。看来对虚函数还有待理解。 ? 1 2 3 4 5 6 7 8
C++中派生类重写基类重载函数时需要注意的问题:派生类函数屏蔽基类中同名函数
派生类可以继承基类中的非私有函数成员,当然也就可以继承其中非私有的被重载的函数。如下: 【参考代码】 class Base { public: void print() { cout << "print() in Base." << endl; } void print(int a) { cout << "print(int a) in Base." <<
C++ 虚函数基类与派生类对象间的表现及其分析
转载地址:http://www.cnblogs.com/Romi/archive/2013/09/18/3329132.html 近来看了侯捷的《深入浅出MFC》,读到C++重要性质中的虚函数与多态那部分内容时,顿时有了疑惑。因为书中说了这么一句:使用“基类之指针”指向“派生类之对象”,由该指针只能调用基类所定义的函数,如果要让基类的指针使用派生类中定义的函数,就将该函数定义为虚函数
基类指针指向派生类对象,调用基类函数,基类函数调用虚函数(派生类已定义)
A.h#ifndef A_H#define A_Hclass A{public: virtual void a(); virtual void b(); virtual void c();};#endifA.cpp#include &lt;iostream&gt;using std::cout;using std::endl;#include "A.h"void A::a(){ cout&lt;...
C++ 基类私有纯虚函数 在派生类中的实现
想验证一下C++ 基类private纯虚函数 在派生类中是否可以实现,若可以,该怎么实现 a.先在网上搜到一下资源 1.【转】“纯虚函数可以设计成私有的,不过这样不允许在本类之外的非友元函数中直接调用它,子类中只有覆盖这种纯虚函数的义务,却没有调用它的权利。” 2.【转】“我记得c++标准里有规定: 虚函数的重载性和它声明的权限无关(好像是这样说的吧,记不清原话了) private的
派生类构造函数中调用基类虚函数,能够发生多态?-(否)
#include&lt;iostream&gt; using namespace std; class A{ public:     A(int a) :a(a)     {          cout &lt;&lt; "constructor A :" &lt;&lt; a &lt;&lt; endl;         test1();         test2();     }  ...
为什么基类指针(或引用)可以调用派生类的private虚函数
基类中定义了public虚函数,在派生类中将其重写,但是设置为private,为什么通过基类指针仍然可以发生动态绑定调用派生类中的private虚函数? 例子如下: class Base { public: // public虚函数 virtual void Disp() { cout << "base.\n"; } }; class Derived : public B
C++中派生类重写基类重载函数
#include using namespace std; class Base { public:        virtual void print() {  //如果不加virtual,输出的全是基类               cout "print() in Base."        }        void print(int a) {   
C# 基类 派生类 方法隐藏 方法重写
最近重新学习C#中基础,找到了隐藏基类方法和重写基类方法的一点区别,二者都是在派生类中定义了与基类中相同的方法,相同点派生类对象将执行各自的派生类中的方法,不同点,在向上转型后,重写基类方法的调用的是派生类的方法,而隐藏基类调用的是基类的方法,具体实验代码:    class Program     {         static void Main(string[] args)    
子类虚函数表(包括虚函数+函数)
对于多重继承,如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表。如下继承关系(没有覆盖): 在子类Derive实例中的虚函数表: 子类自己定义的虚函数会被放到了第一个基类虚函数表中。 如果子类重写了基类虚函数,则在虚函数表中,子类函数会覆盖相应的基类函数: 以上继承重写了f()函数,子类实例的虚函数表变为: 测试: C/C++ code
【6.13】 定义基类Base,其数据成员为高h,定义成员函数disp为虚函数。然后再由High派生出长方体类Cuboid与圆柱体类Cylinder。并在两派生类中定义成员函数disp为虚函数。在主函
#include  using namespace std;  class Base{  protected: double h;  public: Base(double h1) {   h=h1; } virtual void disp()=0;  };  class cuboid:public Base{  private: double wid,len;
为啥继承时基类的析构一般声明为虚函数
1、为啥继承时基类的析构函数声明为虚函数? 文字描述太抽象了,直接用代码给出答案。 (1)第一段代码: #include using namespace std ; class Base { public: Base() { cout << "基类的构造函数被调用了" << endl; } ~Base() { cout << "基类的析构函数被执行了
派生类重写父类方法
派生类重写父类方法 基类A class A { public virtual void fun1() { Console.WriteLine("A 的第1个方法"); } public virtual void fun2() { Console.WriteLine("A 的第2个
C++虚函数基类中不实现导致的报错
今天遇到了一个BUG,出错如下图1所示,是什么matrix()函数未定义,引用自某类A(图1中PinholeCamera类)所在文件中的vtable。 我搜了一下整个A所在的文件也没有找到vtable和有关matrix()函数的调用,感到莫名其妙。 后来去看了一下A的基类B(也就是图1中AbstractCamera类),找到一个虚函数matrix(),将其注释后BUG消除。 原来vtable指
!!!!!!!!!!!!!!!!C++:派生类中重定义基类的成员函数与虚函数区别在哪里?
C++:派生类中重定义基类的成员函数与虚函数区别在哪里? 2012-06-12 15:08风雅风度 | 浏览 1387 次  编程语言C语言函数 派生类定义的成员函数名可能和基类的成员函数名重复,如果原型完全相同,则派生类会有两个远行一模一样的函数,此时,派生类的函数会覆盖基类的函数。 而虚函数貌似只是在基类中多添加了一个virtual,并没有什么区别啊!求解答~
C++虚函数(2) - 虚函数中的参数默认值
参考下面程序的输出: #include using namespace std; class Base { public: virtual void fun ( int x = 0 ) { cout << "Base::fun(), x = " << x << endl; } }; class Derived : public Base { pub
基类中声明为virtual ,派生类中的同名函数
在c++中的继承中,如果基类声明了一个函数为虚函数,那么在派生类中不用声明同名函数为虚函数(不需要加virtual)也可以实现该函数为虚函数。      派生类继承了基类的属性,同名函数被视为与基类具有相同属性的函数。      如果基类为纯虚函数的话,那么派生类中也不用声明
基类析构函数必须为虚函数否则会造成内存泄漏
看看下面程序有什么错误: #include using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public Father { public: Son(){}; ~Son(){}; }; int main() { Father *
基类和派生类的虚函数
查看派生类是否基类公用一个虚函数表,或是否使用相同的虚函数(没有重新实现的情况下)。
c++派生类转换为基类与public、protected、private继承的关系
在《c++primer第四版中文》中p579,对“派生类到基类转换的可访问性”讲的比较模糊,于是用visual studio 2008花了四个小时把大部分能想到的情况都试验了一下,得出如下结果。 这里的后代类指的是由基类派生的派生类派生出来的类。也就是类层次中的第三层。 当为public派生时:  派生类定义体中:   构造函数中:    构造函数体中不能定义派生类对象(虽然能通过编
虚函数基类和子类中都存在时,调用情况分析
首先,给出基类animal和子类fish //============================================================== // animal.h // // begin : 2012-06-30 // author : zwq // describe: 非虚函数情况下,将子类指针赋给积累指针,验证最终调用 //
C++中父类的虚函数必须要实现吗?
一、情景 C++中父类的虚函数必须要实现吗? class Vir{ public: virtual void tryVirtual(); }; class CVir:public Vir{ public: void tryVirtual(){ std::cout<<
C++之虚函数(一)纯虚函数详解
有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。 例如在前边的例12.1(详情请查看:什么是C++虚函数)程序中,基类Point中没有求面积的area函数,因为“点”是没有面积的,也就是说,基类本身不需要这个函数,所以在例12.1程序中的Point类中没有定义area函数。 但是,在其直接派
虚函数必须实现吗?
今天突然想到一个问题,如果基类的一个虚函数子函数
为什么基类的析构函数定义为虚函数
前提: 1:每个析构函数只会清理自己的成员(成员函数前没有virtual)。 2:可能是基类的指针指向派生类的对象,当析构一个指向派生类的成员的基类指针,这时程序不知道这么办,可能会造成内存的泄露,因此此时基类的析构函数要定义为虚函数基类指针可以指向派生类的对象(多态),如果删除该指针delete[]p,就会调用该指针指向的派生类的析构函数,而派生类的对象又会自动调基类的成员函数,这样就会
C++基类虚函数与基函数指针调用虚函数细节辨析
结果分析:定义类的大小Base和Derived类大小相等,创建Base调用了Base的构造函数输出Base信息。创建Derived对象时调用Derived构造函数,Derived构造函数中没有显示调用父类Base构造函数,但是创建Derived对象时依然会调用父类base的构造函数,故输出了Base和Derived构造信息。同样的通过动态分配内存创建Derived对象时也会调用父类构造函数,故输出...
为什么基类的析构函数要声明成虚函数
原因: 在公有继承中,基类的虚构函数如果不声明成为虚函数,那么销毁派生类时有可能造成资源泄漏 class Base{ public:         Base( ) {   };       ~Base( ) {   };  }; class Derived :public Base{    public:        Derived( ) {   };      ~De
c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数
构造函数为什么不能是虚函数呢?     首先需要了解 vptr指针和虚函数表的概念,以及这两者的关联。     vptr指针指向虚函数表,执行虚函数的时候,会调用vptr指针指向的虚函数的地址。     当定义一个对象的时候,首先会分配对象内存空间,然后调用构造函数来初始化对象。vptr变量是在构造函数中进行初始化的。又因为执行虚函数需要通过vptr指针来调用。如果可以定义构造函数为虚函数,...
面向对象程序设计之基类,派生类与虚函数
面向对象程序设计的核心思想是:数据抽象:实现类与接口的分离。继承:定义相似类型并进行相似关系建模。通过继承联系在一起的类构成一种层次关系。通常在在层次关系的根部有一个基类,其他类直接或间接由基类继承而来。这些继承的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。对于某些函数,基类希望它的派生类各自定义适合自身的版本,此时的基类就将这些函数声明成虚函数。cl
试题:两个基类有同名的虚函数要实现, 怎么办?
先把问题陈述一下: 有两个类A, B, 它们可能是别人实现的(或是别人提供的库中的类), 很复杂且已经在用, 你不能修改他们, 你想写一个类C同时具有这两个类的特性, 因为自己实现它代价实在是太大, 所以你想到用C继承A, B以达到效果, 但是有一个问题, A, B具有一个同名的虚函数, 你在C中怎么重新实现这个虚函数呢? 先看下面的代码: #include #include usin
C++ 虚函数;重载与覆盖;虚继承
1.什么是虚函数 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。
基类的析构函数不是虚函数,会带来什么问题!!
看看下面程序有什么错误: #include using namespace std; class Father { public: Father(){}; ~Father(){}; }; class Son:public Father { public: Son(){}; ~Son(){}; }; int main() { Father *
C++类有继承时,析构函数必须为虚函数
虚函数与多态一文中讲了虚函数的用法和要点,但少讲了一点,就是虚函数在析构中的用法,本文就是修复一bug的。C++类有继承时,析构函数必须为虚函数。如果不是虚函数,则使用时可能存在内在泄漏的问题。假设我们有这样一种继承关系: 如果我们以这种方式创建对象:SubClass* pObj = new SubClass(); delete pObj;不管析构函数是否虚函数(即是否加virtual关
C/C++基类的析构函数为什么要为虚函数
为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 (1)第一种情况:没有多态,创建派生类对象,基类的析构函数不是虚函数 #include using namespace std; //基类 class ClxBase{ public: ClxBase() {}; //析构函数不是虚函数 ~ClxBase
effective C++之子类虚函数调用基类函数
-
C++ 虚函数的缺省参数问题
前些日子,有个同学问我一个关于虚函数的缺省参数问题。他是从某个论坛上看到的,但是自己没想通,便来找我。现在分享一下这个问题。先看一小段代码: #include using namespace std; class A { public: virtual void Fun(int number = 10) { cout << "A::Fun
C++之为什么基类的析构函数是虚函数
注:本文章内容大部分来自网站整理。1.为什么基类的析构函数是虚函数?  在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。  下面转自网络:源地址 http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html  a.第一段代码#include&lt;iostream&gt; using namespace std; cl...
C++虚函数(9) - 虚函数能否为private?
C++中, 虚函数可以为private, 并且可以被子类覆盖。 例如,下面程序工作正常: #include class Derived; class Base { private: virtual void fun() { std::cout << "Base Fun"; } friend int main(); }; class Der
由子类实现的虚函数,允许不实现时,要定义成纯虚函数,不要在基类写空实现
如果在基类写了一个无代码的空函数实现,那么基类函数名字变化了,子类忘记修改某个函数名字的话,编译器并不会发现。查找这个问题至少要半个小时,或者几天。 如果是基类虚函数,就不会出现上面的问题。缺点是如果子类不需要覆盖的话,也要做空实现,否则编译不过,不过这个时间最多不超过半个小时。
C++使用虚函数的时候,子类也要使用virtual关键字吗
父类使用虚函数是为了让子类重写,那子类重写的时候也需要带virtual关键字吗?比如: class Base{ virtual bool init(); }; class Derived{ virtual bool init(); //这里的vitual是必须的吗?好像不用也能编译通过呃….. };c++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为
基类的析构函数不是虚函数,会带来什么问题?
派生类的析构函数用不上,会造成资源的泄漏。
C++中为什么有时基类的析构函数必须写为虚函数
在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。编译器总是根据类型来调用类成员函数。但是一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个 基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于派生类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。所以通常是将析构函数声明为虚函数。一个基类的函数一旦声明为虚函数,那么不管你是否加上virtual修饰符,它在所有派生类中都成为虚
基类子类虚函数的调用顺序问题
虚函数基类与子类构造函数中调用虚函数。当生成子类对象时,函数的调用顺序是怎样的
c++父类虚函数被子类虚函数覆盖后,如何直接调用父类的虚函数
研究过虚函数表的人都知道c++的多态是来自于虚函数表的函数指针覆盖,那么子类的虚函数指针覆盖了虚函数表中相应位置的父类虚函数指针后,那是怎么调用父类的虚函数的呢?即有如下继承关系:class fa{ public: virtual void show(){cout &lt;&lt; "fa" &lt;&lt; endl;} }; class son : public fa{ publi...
c++中的 虚函数虚函数基类
原文出自http://blog.csdn.net/dardgen/article/details/18790977 虚函数 ,纯虚函数, 虚基类,它们都和virtual有关,这三个带有虚字的定义容易使人混淆,下面先从作用上来解释这三个定义的区别: 1.虚函数是用于多态中virtual修饰父类函数,确保父类指针调用子类对象时,运行子类函数的。 2.纯虚函数是用来定义接口的,也就
关于类的虚函数的public,private的继承问题。
下面的代码编译结果报错。 test.c: In function `int main(int, char**)': test.c:18:22: error: `virtual void TEST2::testxiongyf()' is private test.c:60:25: error: within this context 但是看60行。 如果把private切换为public,
虚函数调用时一点注意,调用基类函数时调用派生类函数
一般的认为,虚机制发生在对象调用 时,其实不然,只要能用到之时,他便会出现!在调用基类函数的时候,如果基类调用了一个虚函数,同样虚机制也会产生效果!看一个程序,没有virtual的情况: #include iostream>using namespace std;class Base ...{public:    Base() ...{}    virtual ~Base() ..
基类指针(或引用)指向派生类对象(或引用)时调用虚函数的过程(使用虚函数表指针)
在一个类的成员函数前面加virtual 关键字,在另一个类中不加virtual关键字,除此之外两类的成员完全相同,然后用sizeof()判断两类的大小。 代码如下: #include &amp;lt;iostream&amp;gt; class Parent1 { public: int p1; virtual void func()//加virtual关键字声明为虚函数 { ...
C++的虚函数和虚析构函数
疑问: 如何利用一个循环结构,依次处理同一个类族中不同类的对象? 如何解决这个问题呢?这就要应用到虚函数来实现多态性。
基类虚函数没有实现而引起的错误
先看一个错误的程序: #include using namespace std; class Basic { public: virtual void fun(); }; class A : public Basic { public: void fun() { cout << "hi" << endl; } }; int main() { A a; return 0
c++派生类覆盖基类的问题
派生类函数与基类函数同名,则会覆盖基类的函数调用,如下。 class Base{ private: int x; public : virtural void mf1()=0; virtural void mf1(int); virtual void mf2(); void mf3...
基类的继承,虚函数,覆盖和隐藏
一、类与类之间关系: 1、类与类之间可能会存在共性。 2、类与类之间必定会有差异。 3、为了节约开发时间和代码量,我们在设计类时可以把类的共享代码,抽象出来形成一个基础类(基类)。 4、使用基类+差异生成一个新的类的叫派生类 二、继承的语法 1、在设计一个类时如果已有的类中有它需要的成员,它可以从已有的类中继承哪些成员,被继承的类叫父类或基类,继承类叫作派生类或子类。 cl...
面试中c++中单继承关于虚函数常遇到的4个问题
在讲到虚函数之前,先附一张表(如果急切,直接翻到说虚函数的部分即可)   基类的私有成员变量,派生类虽能继承,但不能访问,是不可见的。   基类的保护成员和派生类的唯一不同就是作用域。   除了析构和所有的构造不可继承外,其他都可继承    基类和派生类成员方法的关系: 重载:(同一作用域),方法名相同,返回值类型,参数列表不同。 隐藏:(使用前提:派生类对象调用继承于基类的方法)同名
带有虚函数的菱形继承和带有虚函数的菱形虚继承
对于某些函数来说,基类希望它的派生类定义适合自身的版本,此时基类就将这些函数声明为虚函数。 在存在虚函的类,创建对象时会产生虚表指针,虚表指针指向一个虚表,这时就可以通过虚表访问自己定义的函数。 通过下面两种继承进行分析: 【带有虚函数的菱形继承】 以下图的模型为例进行分析: class A { public : A() :a(1) {}
C++中虚函数的用法详细讲解
我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次结构中,在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序中,在Circle类中定义了 area函数,在Circle类的派生类Cylinder中也定义了一个area函数。这两个函数不仅名字相同,而
使用纯虚函数的一个小细节——派生类定义该虚函数时声明语句必须与基类里完全一致
问题描述:纯虚函数在派生类里明明补写出来了定义,但是实际发现是无效的,派生类因没有定义该纯虚函数同样被编译器视为了抽象类。 原因很有可能是:基类和派生类的虚函数必须类型、名字、参数数量、名字、类型、以及函数前后缀的各种其他属性(比如const等)必须完全一致!否则会被认为不是同一个函数。无法产生“覆盖”的效果,而可能仅仅是“重载”,这样就会有各种意想不到的问题了。比如我便是在派生类里重写该纯虚函...
指向子类对象的基类指针调用非虚函数都是基类的函数吗
http://zhidao.baidu.com/link?url=TnU1jDUkDcuvRBPRCnasc-yC_8rrlMFZSKI1Y0l8F-EOmEB5h4p7xT_yfu4ktXjF5Xx_zA9M-qsxCaqXQDJ6J_ 指向子类对象的基类指针调用非虚函数都是基类的函数吗  分享| 2013-07-05 16:46Maxwell404 | 浏览 5
Python学习手册:第4版(涵盖Python2.6和3.X)
学习Python的主要内建对象类型:数字、列表和字典。使用Python语句创建和处理对象,并且学习Python的通用语法模型。使用函数构造和重用代码,函数是Python的基本过程工具。学习Python模块:封装语句、函数以及其他工具,以便构建较大的组件。学习Python的面向对象编程工具,用于组织程序代码。学习异常处理模型,以及用于编写较大程序的开发工具。了解高级Python工具,如装饰器、描述器、元类和Unicode处理等。
虚函数——用基类指针访问派生类中的成员函数》
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称: 《虚函数——用基类指针访问派生类中的成员函数》 * 作 者: 刘江波 * 完成日期: 2012 年 7 月 3 日 * 版 本 号: v.73 * 对任务及求解方法的描述部分 * 问题
为什么要使用多态,而不直接使用派生类对象调用虚函数?在构造函数以基类引用作形参,以派生类对象作传入的实参。
c++中基类指针指向派生类时,调用的虚函数是派生类的。那为何不直接用派生类的对象来调用就行了,设计虚函数的真正意图是什么?直接用派生类的对象是可以的,但是虚函数的作用体现在多态上。在实际编程中,往往不直接通过派生类对象来调用其成员函数,而是通过一个指向派生类对象的指针(或引用)来调用其成员函数。这在面向对象编程中非常常见。其好处是:通过这个基类指针或者引用来调用虚函数的时候,实际执行的是派生类对象...
基类和子类中虚函数的参数默认值值不同的情况
1.虚函数中的默认值 根据输出结果,可以看到最终调用的是子类的fun()函数,并且使用了基类函数fun()中的默认值。 默认参数是不会做为判断函数是否相同的因素的。所以子类与基类中的fun()函数被认为是相同的,这样基类的fun()函数被隐藏了。另外,默认值是在编译期间使用的。当编译器看到一个函数调用中的某个参数缺失了,它就会用默认提供的值来替换。因此,上面程序中,x的值在编译期间被替换了,在运...
C++重载覆盖和隐藏,虚函数与纯虚函数
这几个概念都有一个共同点:函数名称相同,所以不免让人混淆,大致的区别如下: 重载(overload): 必须在一个域中,函数名称相同但是函数参数不同,重载的作用就是同一个函数有不同的行为,因此不是在一个域中的函数是无法构成重载的,这个是重载的重要特征 覆盖(override): 覆盖指的是派生类的虚拟函数覆盖了基类的同名且参数相同的函数,既然是和虚拟函数挂钩,说明了这个是一个多态支
C++(笔记)虚方法
一、使用&特性 1.可在任何方法上添加virtual,例:virtual void play(); 2.继承性:一旦基类中为虚函数,子类将不会为非虚函数 3.优缺性:声明虚方法除了使程序慢一点点以外,没有任何缺点 二、说说为什么要用虚方法 因为当我们使用基类的引用或指针调用基类中定义的某个函数时,我们并不知道该函数真正的对象是什么类型(属于哪个类),因为它可能是一个基类的对象,也
C++ 基类指针数组,虚函数
实验题目: 定义一个抽象基类shape,由它派生5个类:circle,square,rectangle,trapezoid,triangle 用虚函数分别计算图形的面积,要求用基类指针数组,使他们的每个元素指向一个派生类对象 。程序如下: #include #include using namespace std; class Shape { public: virtual void
C++学习笔记(13)——利用对象、引用、指针调用虚函数
本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                                  利用对象、引用、指针调用虚函数                                        虚函数实现原理说明:         
关于虚函数的问题(定义虚函数与未定义时的区别)
对于继承与派生中基类与子类的同名函数问题,可能会困扰许多人:在重名函数的调用过程中,若使用同一个对象取调用这个同名函数,一般的会根据覆盖原则,调用子类中的函数。要想调用基类的函数则必须通过建立不同的对象去分别调用·,而如果想用用同一种调用形式取调用的话,一般会选取指针;而在指针的调用过程中,又会出现一些问题:定义一个指向基类的指针,让它指向基类的对象,则可以通过这个指针调用同名的函数;再使这个指针...
为何使用dynamic_cast转换类指针时,需要虚函数
虚函数对于dynamic_cast转换的作用   为何使用dynamic_cast转换类指针时,需要虚函数呢。 Dynamic_cast转换是在运行时进行转换,运行时转换就需要知道类对象的信息(继承关系等)。 如何在运行时获取到这个信息——虚函数表。   C++对象模型中,对象实例最前面的就是虚函数表指针, 通过这个指针可以获取到该类对象的所有虚函数,包括父类的。 因为派生类会继承基类
c++ 基类指针指向派生类对象 虚函数 多态 动态联编
一:继承中的指针问题。(基类指针指向派生类对象)1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承而来的那些成员,不能访问子类特有的元素,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;D dd; p=&amp;dd是可以的,指针p只能访问从基类派生而来的成员,不能访问派生类D特有的成员.因为基类不知道派生类中的这些成员。2. 不...
描述:override保留字表示当前函数重写了基类虚函数
目的:1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);2.强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。 用法:在类的成员函数参数列表后面添加该关键字既可。 例子: class Base { virtual void f(); }; class Derived : public Base { void f() ov
基类的指针指向派生类的对象
说明:只要基类的成员函数是虚函数,派生类的同名函数不管有没有显示声明virtual都是虚函数。 #include "stdafx.h" #include "iostream" using namespace std; class A { int x; public: A(int i) {x=i;} void show() { cout<<
虚函数和虚拟基类 用法小结
申明:本文主要参考MSDN 虚继承:在继承定义中包含了virtual关键字的继承关系; 虚基类:在虚继承体系中的通过virtual继承而来的基类; 声明虚基类的一般形式为    class 派生类名: virtual 继承方式 基类名 需要注意: 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。 将类A声明为虚
C++运行时通过基类指针或引用调用派生类虛函数的实现原理: 虛函数表
我们知道要实现运行时的多态, 必须在基类中声明和定义相关的虛函数, 并在派生类中重新实现基类中的虛函数. 当编译器见到这种继承层次结构的时候, 编译器将为定义了虛函数的基类和覆盖了基类虛函数的派生类分别创建一张虛函数表(Virtual Function Table, VFT), 也就是说通过编译器的编译, 基类和派生类的代码中都将有自己的虛函数表. 为这些类创建实例化对象时, 会在实例化的...
继承中虚函数的缺省参数值问题
如果类继承中重新定义了虚函数,那么虚函数中的缺省参数不要重新定义。 用一句话来解释原因就是:虚函数是动态绑定的(dynamically bound),但是缺省参数却是静态绑定的(statically bound)。 静态类型和动态类型 首先需要了解什么是对象的静态类型和动态类型,对象的所谓静态类型(static type),就是它在程序中被声明时所采用的类型。 以下面的类为例: clas
c++中虚基类表和虚函数表的布局
本文涉及到C++中对象的内存布局知识,若无该方面基础建议先阅读haoel(陈皓)专栏的C++对象内存布局的博客: http://blog.csdn.net/haoel/article/details/3081328
C++的虚基类虚函数
虚函数是为了实现多态性,虚基类是为了解决多重继承的二义性问题。
C++继承中虚函数的使用
一:继承中的指针问题。 1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承 而来的那些成员,不能访问子类特有的元素 ,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;D  dd; p=ⅆ是可以的,指针p只能访问从基类派生而来的成员,不能访问派生类D特有的成员.因为基类不 知道派生类中的这些成员。 2.
Python中的多态与虚函数
1.前言    C++中的
构造函数中为什么不能调用虚函数
构造函数中为什么不能调用虚函数? 构造函数调用层次会导致一个有趣的两难选择。试想:如果我们在构造函数中并且调用了虚函数,那么会发生什么现象呢?在普通的成员函数中,我们可以想象所发生的情况——虚函数的调用是在运行时决定的。这是因为编译时这个对象并不能知道它是属于这个成员函数所在的那个类,还是属于由它派生出来的某个类。于是,我们也许会认为在构造函数中也会发生同样的事情。 然而,情况并非如此。对于在...
虚函数在类外可以定义的
class A { public: virtual void pureVirtualFunc() = 0; }; void A::pureVirtualFunc() { cout<<
在非虚函数中调用虚函数
一,下面是一个在非虚函数中调用虚函数的例子 #include using namespace std; class Base { protected: int i; public: Base(int j):i(j){} virtual ~Base(){} virtual void func2(){ i ++; } void fu
C++ 虚函数 重载 重写的区别(转)
版权声明:本文转自http://blog.csdn.net/hackbuteer1/article/details/7475622  C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。   多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面
C++ 构造函数,析构函数中能否调用虚函数
原文地址 http://blog.csdn.net/to_xidianhph_youth/article/details/39134801题1题2 题3class Base { public: virtual int foo(int x) { return x * 10; } int foo(char x[14]) { r
C/C++基类的析构函数为什么必须定义为虚函数
C/C++基类的析构函数为什么必须定义为虚函数?   为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 (1)第一种情况:没有多态,创建派生类对象,基类的析构函数不是虚函数 #include&lt;iostream&gt; using namespace std; //基类 class ClxBase{ public: ...
c++虚函数 默认参数
基类和继承类中的虚函数同时有默认参数时,通过基类引用或指针调用虚函数,默认参数为基类的默认参数
虚函数使用注意事项
转载自:昵称:welkinwalker 定义:虚函数就是给函数的前边加上 virtual 就可以了,虚函数必须是非静态的成员函数,   没有继承特性的函数不能为虚函数。   作用: 虚函数主要是为了实现动态联编, 也可以说是多态。在基类当中定义了虚函数, 可以   再子类中定义和基类中相同函数名、相同参数、相同返回值和不同实现体的虚函数, ( 只要在基类中定义成为虚
Qt Creator 自动补齐函数参数问题
遇到的问题 使用Qt Creator集成开发环境进行项目编码时,经常需要重写父类的虚函数去实现自己想要的功能,但是当声明这些函数时,经常遇到函数名可以自动补齐,但是函数的参数却不能自动补齐的情况,可能是有些Qt Creator的版本支持只要敲函数名的前几个字符就会把函数名连同参数一并给补全,但是博主使用的IDE版本中大都都只是补全函数名,函数参数不会自动补全。 如何解决 一开始博主以
const虚函数
在C++中,对于两个函数,一个有const修饰,一个没有const修饰,认为这两个函数是不同的函数。 而虚函数的要求是,函数原型相同,函数原型包括:函数返回值、函数名、参数列表、const修饰符。这里const修饰符包括函数返回值的修饰,函数形参的修饰,函数本身的修饰。只要有一处const没有对上 ,那么就不是虚函数的重载,而是发生了同名覆盖现象。这个与编译器的工作原理有关。 所以对于基类的c
关于虚函数排布顺序
关于虚函数排布顺序
C++虚函数继承与虚继承
虚函数继承和虚继承是完全不同的两个概念。 虚函数继承是解决多态性的,当用基类指针指向派生类对象的时候,基类指针调用虚函数的时候会自动调用派生类的虚函数,这就是多态性,也叫动态编联。 虚继承就是为了节约内存,他是多重继承中的特有的概念。适用于菱形继承形式。 比如B继承于A、C继承于A、D继承于B和C,显然D会继承两次A(图1)。因此,为了节省空间,可以将B、C对A的继承定义为虚拟继承,而A就成...
虚函数必须定义(纯虚函数除外)
1. 虚函数的声明和定义 具体关于虚函数的知识不做多讲,我在定义一个抽象类时,忘了将一个虚函数声明为 纯虚函数,又没有对其定义, 导致编译报错时报错如下: undefined reference to `vtable for Fibonacci' 错误提示的很明显,就是无法生成虚函数表。 我们知道,虚函数表(地址)在定义了虚函数的类所实例化的对象内存中的第一个位置,也就是在实例化过
我们是很有底线的