C++多态性及虚函数


多态性

多态性是面向对象程序设计的重要特性

一种接口,多种方法

在C++程序设计中,多态性是指具有不同功能的函数可以使用同一个函数名

在面向对象方法中多态性一般表述为:向不同的对象发送同一个消息,不同的对象在接收时会产生不同行为

多态性可分为:静态多态性和动态多态性

静态多态性(编译多态性):在程序编译时系统就能决定调用哪个函数,通过重载实现(包括函数的重载、运算符的重载)

动态多态性(运行多态性):在程序运行的时候才动态的确定操作所针对的对象,通过虚函数实现

 

虚函数

在同一个类中不能定义两个名字相同、参数类型及个数都相同的函数,否则就是“重复定义”(多重继承下来两个完全相同的不算重复定义)。而在继承层次结构中,不同层次中可以出现名字、参数类型、参数个数都相同的函数,因为在不同层次中编译系统会按照同名屏蔽的原则调用派生类的函数

特别说明析构函数也可以为虚,实现原理相同(虚函数表实现),但构造函数不能为虚,因为指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢

谭浩强版本中:虚函数的作用是允许在派生类中重新定义与基类同名的函数,并通过基类指针或引用来访问基类和派生类中的同名函数。

个人觉得前半句不妥,即无虚函数仍可以在派生类中重新定义与基类同名的函数,举例说明:

class A
{
 public:
 void ss()
 {cout<<"hello"<<endl;}
};
class B:public A
{
 public:
 void ss()
 {cout<<"world"<<endl;} 
};
int main()
{
 B b1;
 b1.ss(); //调用的是类B中新增的ss()函数
 b1.A::ss(); //调用的是类A中的ss()函数
}

虚函数真正作用突破了无法通过基类指针或引用去调用派生类对象中的成员函数的限制,从而实现了动态多态性

举例分析:

class A
{
 public:
 virtual void ss()
 {cout<<"hello"<<endl;}
};
class B:public A
{
 public:
 void ss()
 {cout<<"world"<<endl;} 
};
class C:public B
{
 public:
 void ss()
 {cout<<"!!"<<endl;} 
};
void show(A *p)
{
 p->ss();
}
int main()
{
 A a1;
 B b1;
 C c1;
 show(&a1);
 show(&b1); 
 show(&c1);
}

C++中的函数多态性应用&虚函数的灵活应用  

C++ 虚函数与纯虚函数

C++中虚函数工作原理和(虚)继承类的内存占用大小计算

C++继承:同名隐藏、覆盖,虚函数

C++中的函数多态性应用&虚函数的灵活应用

C++中基类的构造函数调用虚函数的问题及ATL_NO_VTBL宏

 

继续阅读本文的精彩内容请看第2页

  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容