Polymorphism.cppRUN

//多态的简易用法
#include < iostream>

class Base
{
private:
	int x, y;
public:
	Base()
	{
		x = 0; 
		y = 0;
	}
	virtual ~Base() {}//类中使用了虚函数,析构函数也应虚函数形式

	void Fun0()//普通函数,没得虚函数机制
	{
		std::cout << "Base::Fun0\n";
	}

	virtual void FunV()//虚函数
	{
		std::cout << "Base::FunV\n";
	}
};

class Deri1 :public Base
{
public:
	void Fun0()
	{
		std::cout << "Deri1::Fun0\n";
	}

	virtual void FunV()//虚函数
	{
		std::cout << "Deri1::FunV\n";
	}
};

class Deri2 :public Base
{
public:
	void Fun0()
	{
		std::cout << "Deri2::Fun0\n";
	}

	virtual void FunV()//虚函数
	{
		std::cout << "Deri2::FunV\n";
	}
};

//按值传递,不会启用多态机制
void FunByValue(Base b)
{//转换成基类
	b.Fun0(); //Base::Fun0
	b.FunV(); //Base::FunV
}

//基类指针方式,可能启用多态机制
void FunByPointer(Base *pB)
{
	pB->Fun0(); //普通函数,不会启用多态机制,调用 Base::Fun0;
	pB->FunV(); //pB会选择正确的接口:如,pB指向Deri2对象,会先调用Deri2::Fun0
}

//基类引用,可能启用多态机制
void FunByRef(Base &b)
{
	b.Fun0(); //普通函数,不会启用多态机制,调用 Base::Fun0;
	b.FunV(); //p会选择正确的接口:如,b指向Deri2对象,会先调用Deri2::Fun0
}

int main()
{
	Base b;
	Deri1 d1;
	Deri2 d2;
	
	//启用多态的方法时使用基类指针或者引用去调用接口。

	FunByValue(d1);//按值传递,没有多态。d1会转换成Base

	FunByRef(d1);//引用方式,可以启动多态机制
	FunByPointer(&d1);//指针方式,可以启动多态机制

	return 0;
}