虚函数的定义
虚函数用来表现基类和派生类的成员函数之间的一种关系.
虚函数的定义在基类中进行,在需要定义为虚函数的成员函数的声明前冠以关键字 virtual.
基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义.
在派生类中重新定义时,其函数原型,包括返回类型,函数名,参数个数,参数类型及参数的先后顺序,都必须与基类中的原型完全相同.
虚函数是重载的一种表现形式,是一种动态的重载方式.
2. 为什么使用虚函数
#include
class CBase{
public:
void who( )
{cout<<"this is the base class!\n";}
};
class CDerive1 : public CBase{
public:
void who( )
{cout<<"this is the derive1 class!\n";}
};
class CDerive2 : public CBase{
public:
void who( )
{cout< who( );
p = &obj2;
p -> who( );
p = &obj3;
p -> who( );
obj2.who( );
obj3.who( );
return 1;
}
运行结果:
this is the base class!
this is the base class!
this is the base class!
this is the derive1 class!
this is the derive2 class!
通过对象指针进行的普通成员函数调用,仅仅与指针的类型有关,而与此刻正指向什么对象无关.要想实现当指针指向不同对象时执行不同的操作,就必须将基类相应中的成员函数定义为虚函数.
3. 虚函数与重载函数的关系
一般的重载函数,函数的返回类型及所带的参数必须至少有一样不完全相同,只需函数名相同即可.
基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型,函数名,参数个数,参数类型及参数的先后顺序,都必须与基类中的原型完全相同.
重载虚函数时,若与基类中的函数原型出现不同,系统将根据不同情况分别处理:
(1)仅仅返回类型不同,其余相同,系统会当作出错处理;
(2)函数原型不同,仅仅函数名相同,系统会认为是一般的函数重载,将丢失虚特性.
3.3.4 虚基类
#include
class x{
protected:
int a;
public:
void f ( ) ;
};
class x1 : public x {
public:
x1( ){cout<};
class x2 : public x {
public:
x2( ){ cout<};
class y : public x1, public x2{
public:
y( ){ cout<};
main( )
{
y obj; //error
obj . f ( ) ; //error
return ;
}
二义性错误
非虚基类的类层次
虚基类的类层次
当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类.
class x1 : virtual public x
{
// … …
};
class x2 : virtual public x
{
// … …
};
虚基类的初始化
虚基类的初始化与一般多继承的初始化在语法上是一样的,但构造函数的调用次序不同.
派生类构造函数的调用次序有三个原则:
(1) 虚基类的构造函数在非虚基类之前调用;
(2) 若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用;
(3) 若虚基类由非虚基类派生而来,则仍先调用基类构造函数,再调用派生类的构造函数.
纯虚函数
仅仅用来为要从基类中派生的函数占据一个位置。
纯虚函数在基类中没有定义,它们被初始化为0。
任何用纯虚函数派生的类,都要自己提供该函数的具体实现。
定义纯虚函数
virtual void myMethod(void) = 0;
By 风之风信子
请问高手,C++虚函数表是什么?怎么用啊?
虚函数的定义 虚函数用来表现基类和派生类的成员函数之间的一种关系. 虚函数的定义在基类中进行,在需要定义为虚函数的成员函数的声明前冠以关键字 virtual. 基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义. 在派生类中重新定义时,其函数原型,包括返回类型,函数...
虚函数 纯虚函数是一个东西吗?
在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念。因为它充分体现了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广。比如在微软的MFC类库中,你会发现很多函数都有virtual关键字,也就是说,它们都是虚函数。难怪有人甚至称虚函数是C++语言的精髓。 那么,什么是虚函数呢,我们先...
关于C++虚拟函数的问题
virtual SubClass* afn()这个你要是把afn函数里面+个参数还可以实现一下函数的的重载 如果是你这样不能实现函数的重载,因为重载函数不以返回值来区分.把virtual SubClass* afn() 改为:virtual Base * afn()或者Base * afn()都可以 建议你去看一下虚函数的作用;下面是我跟你改的个简单一点的虚...
高分c++ typedef 访问基类的私有虚函数
\/\/使用typedef来定义一个函数指针,可以参阅相关资料typedef void( *Fun )( void ); void main() { B b; \/\/ 一个子类的对象\/\/这里如果不用typedef的话就应该是\/\/void( *pFun )( void );Fun pFun;for(int i = 0 ; i < 3; i++) { \/\/其实是得到b的地址,但是不能直接写成int ...
高手替我解释C++中virtual,要详细,谢谢!
有两种用法,一种是虚函数以实现多态,另一种是虚继承,解决菱形继承问题 还是自己搜下好 搜 重载 覆盖 隐藏 再搜一次 虚拟继承
高手替我解释C++中virtual,要详细,谢谢!
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。多态性是允许将父对象设置成为和一个和多个它的子对象相等的技术,比如Parent:=Child;赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作...
C++的学习方法!~
而《C++沉思录》给我的更深层思考是什么才是运用C++最合理的方式。推荐。 《C++ STL中文版》:很朴实,不花俏,但是价值很高。个人认为其主要价值体现在以下几个方面:1,对于STL的实现关键iterator一般都使用了两种方式描叙,一种比较老式的函数方法,一种是新的?traits技巧,这样读者可以非常清楚的知道技术的演进。2,...
现有一道 C++编程题,请各位高手能够鼎力相助。速求……急!
回答:长见识了啊...感谢楼主!
C与C++谁的效率高,为什么?
C++引入的那些新特性,比如虚函数啊什么的都是有额外开销的。当然了,最重要的还是看程序员的水平,如果一个槽糕的C程序员写出来的槽糕C程序,它的效率也并不见得比一个C++高手写出来的C++程序效率高。C++运行效率略低于C,和低程度取决于具体问题,程序员的水平。在现实生活中没有足够的大项目的程序...
visual studio c++中类是不是太浪费内存?
首先,其实C++中class和struct没有本质区别的。函数代码是类的所有对象公用的,每个对象只保存自身的数据。如果是非虚函数,不会占用对象的任何空间,如果是虚函数,也只占用一个函数指针的空间而已。你建立对象不会复制代码也不会复制类的static数据,只会保存这个类自己的数据而已。现在的编译器很强大,...