Polymorphism.cpp,RUN
//多态的简易用法
#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;
}