一.类型兼容规则举例:通过派生类指针调用多态函数,实际上调用是基态的函数。
#include<iostream>
using namespace std;
class Base
{
public:
virtual void fun1()
{
cout << "Base::fun1()" << endl;
}
virtual ~Base(){ }
};
class Derived1 :public Base
{
public:
/*virtual*/ void fun1()
{
cout << "Derived1::fun1()" << endl;
}
/*virtual*/ void fun2()
{
cout << "Derived1::fun2()" << endl;
}
};
class Derived2 :public Derived1
{
public:
/*virtual*/ void fun1()
{
cout << "Derived2::fun1()" << endl;
}
/*virtual*/ void fun2()
{
cout << "Derived2::fun2()" << endl;
}
};
void fun(Base *pb)
{
pb->fun1();
Derived1 *pd = dynamic_cast<Derived1 *>(pb);
if (pd)
pd->fun2();
}
int main()
{
Base b;
fun(&b);
Derived1 d1;
fun(&d1);
Derived2 d2;
fun(&d2);
return 0;
}
运行结果:
Base::fun1()
Derived1::fun1()
Derived1::fun2()
Derived2::fun1()
Derived1::fun2()
//此处运行结果第五条很好地体现了这一规则。
二,将上面的程序稍加改动:
#include<iostream>
using namespace std;
class Base
{
public:
virtual void fun1()
{
cout << "Base::fun1()" << endl;
}
virtual ~Base(){ }
};
class Derived1 :public Base
{
public:
virtual void fun1()
{
cout << "Derived1::fun1()" << endl;
}
virtual void fun2()
{
cout << "Derived1::fun2()" << endl;
}
};
class Derived2 :public Derived1
{
public:
virtual void fun1()
{
cout << "Derived2::fun1()" << endl;
}
virtual void fun2()
{
cout << "Derived2::fun2()" << endl;
}
};
void fun(Base *pb)
{
pb->fun1();
Derived1 *pd = dynamic_cast<Derived1 *>(pb);
if (pd)
pd->fun2();
}
int main()
{
Base b;
fun(&b);
Derived1 d1;
fun(&d1);
Derived2 d2;
fun(&d2);
return 0;
}
运行结果:
Base::fun1()
Derived1::fun1()
Derived1::fun2()
Derived2::fun1()
Derived2::fun2()
//此处第五条,调用的是基类Derived1的指针,但是由于Derived1指针所指向的对象是Derived2型的,由于多态性,调用派生类的函数而非子类函数。