32多态

多态

  • 静态(编译时期)的多态:函数重载(在编译阶段就确定好调用的函数版本)、模板(函数模板和类模板)
  • 动态(运行时期)的多态:在继承结构中,基类指针(引用)指向派生类对象,通过该指针(引用)调用同名覆盖方法(虚函数),基类指针指向哪个派生类对象,就会调用哪个派生类的覆盖方法,称为多态。
pbase->show();
//多态底层是通过动态绑定来实现的
//pbase->访问谁的vfptr->访问谁的vftable->当然调用的是对应的派生类对象的方法
class Animal
{
public:
	Animal(string name) : _name(name) {}
	virtual void bark() {}
protected:
	string _name;
};

class Cat : public Animal
{
public:
	Cat(string name) : Animal(name) {}
	void bark() { cout << _name << " bark: miao miao!" << endl; }
};


class Dog : public Animal
{
public:
	Dog(string name) : Animal(name) {}
	void bark() { cout << _name << " bark: wang wang!" << endl; }
};

class Pig : public Animal
{
public:
	Pig(string name) : Animal(name) {}
	void bark() { cout << _name << " bark: heng heng!" << endl; }
};

/*
下面的API无法做到“开-闭”原则:对修改关闭,对扩展开放

void bark(Cat &cat)
{
	cat.bark();
}

void bark(Dog& dog)
{
	dog.bark();
}

void bark(Pig& pig)
{
	pig.bark();
}
*/

void bark(Animal* p) //(Animal& p){p.bark();}这样也能实现功能,但是属于静态绑定
{
	p->bark();
}

int main()
{
	Cat cat("猫咪");
	Dog dog("二哈");
	Pig pig("佩奇");

	bark(&cat); // 动态绑定
	bark(&dog);
	bark(&pig);

	return 0;
}

继承/多态的好处:

  • 代码复用效率提高
  • 基类中提供统一的虚函数接口,派生类重写。
posted @ 2024-01-25 17:01  SIo_2  阅读(11)  评论(0)    收藏  举报