什么时候发生多态?
- 当基类的指针或引用指向派生类时,发生多态。基类的指针指向基类或派生类的指针指向派生类时都不会发生多态;
实际上只有通过printer或reference的间接处理,才支持OO程序设计所需要的多态性质。
…
具体请参考《深度探索c++对象模型》
多态产生的前提条件:
(1) 要有继承关系;
(2)子类重写父类的方法;
(3)父类引用指向子类实例;
小程序:
#include <iostream>
#include <string>
using namespace std;
class Animals
{
public:
Animals() {}
void sound()
{
cout << "animals::sound()" << endl;
}
virtual void virtualSound()
{
cout << "animals::virtualSound()" << endl;
}
static void staticSound()
{
cout << "animals::staticSound()" << endl;
}
};
class Dog : public Animals
{
public:
Dog() {}
void sound()
{
cout << "Dog::sound()" << endl;
}
virtual void virtualSound()
{
cout << "Dog::virtualSound()" << endl;
}
static void staticSound()
{
cout << "Dog::staticSound" << endl;
}
};
class Cat : public Animals
{
public:
Cat() {}
void sound()
{
cout << "Cat::sound()" << endl;
}
virtual void virtualSound()
{
cout << "Cat::virtualSound()" << endl;
}
static void staticSound()
{
cout << "Cat::staticSound" << endl;
}
};
int main()
{
Animals *a = new Dog();
Animals *b = new Cat();
a->sound(); //animals::sound()
b->sound(); //animals::sound()
a->virtualSound(); //Dog::virtualSound()
b->virtualSound(); //Cat::virtualSound()
a->staticSound(); //animals::staticSound()
b->staticSound(); //animals::staticSound()
Dog *dog = new Dog();
dog->sound(); //Dog::sound()
dog->virtualSound(); //Dog::virtualSound()
dog->staticSound(); //Dog::staticSound
delete a;
delete b;
return 0;
}
为什么说静态成员无多态特性?
virtual函数一定要通过对象来调用,即有隐藏的this指针。
static成员没有this指针是关键!
static function都是静态决议的(编译的时候就绑定了)
而virtual function 是动态决议的(运行时候才绑定)