一,C实现多态
c_examp.c
/**
* C实现多态
*/
#include<stdio.h>
/// 重定义一个函数指针类型
typedef void (*pf) (); // 指向参数为0, 返回值为void的函数
/**
* @brief 父类
*/
typedef struct _A
{
pf _f; // 定义一个函数指针对象
}A;
/**
* 子类
*/
typedef struct _B
{
A _b; ///< 在子类中定义一个基类的对象即可实现对父类的继承。
}B;
void FunA()
{
printf("%s\n", "Base A::fun()");
}
void FunB()
{
printf("%s\n", "Derived B::fun()");
}
int main()
{
A a;
B b;
a._f = FunA; // A的函数指针_f指向函数FunA()
b._b._f = FunB; // B中的A的函数指针_f指向函数FunB()
A *pa = &a; // pa指针指向对象a
pa->_f(); // 调用对象a的函数指针_f
pa = (A*)&b; /// 让父类指针指向子类的对象,由于类型不匹配所以要进行强转。
pa->_f(); // 用父类指针指调用子类中的对象
return 0;
}
二,c++中的多态
c++_examp.cpp
/**
* c++中的多态
*/
#include<iostream>
using namespace std;
class A{
public:
virtual void f() // 虚函数实现
{
cout << "Base A::f() " << endl;
}
};
class B : public A // 必须为公有继承,否则后面调不到,class默认为私有继承!
{
public:
virtual void f() // 虚函数实现,子类中virtual关键字可以没有
{
cout << "Derived B::f() " << endl;
}
};
int main() {
A a; // 基类对象
B b; //派生类对象
A *pa = &a; // 父类指针指向父类对象
pa->f(); // 调用父类的函数
pa = &b; // 父类指针指向子类对象,多态实现
pa->f(); // 调用派生类同名函数
return 0;
}