c实现多态的方法

在C语言中,实现多态的方法通常是通过 函数指针和结构体来实现。具体步骤如下:

定义基类结构体

包含一个函数指针作为成员变量,表示虚函数。

定义多个子类结构体

每个子类都包含相同的虚函数,并且实现自己的具体函数逻辑。

在子类的构造函数中 ,将子类的函数指针指向子类自身的函数。

在使用时,通过基类指针调用虚函数,实现多态效果。

示例代码如下:

c<p>include <stdio.h></p><p>// 基类结构体<p>typedef struct {<p> void (*func)(void);<p>} BaseClass;</p><p>// 子类1结构体<p>typedef struct {<p> BaseClass base;<p>} SubClass1;</p><p>void func1() {<p> printf("This is func1.\n");<p>}</p><p>// 子类2结构体<p>typedef struct {<p> BaseClass base;<p>} SubClass2;</p><p>void func2() {<p> printf("This is func2.\n");<p>}</p><p>int main() {<p> SubClass1 sub1;<p> SubClass2 sub2;</p><p> // 初始化子类1<p> sub1.base.func = func1;<p> // 初始化子类2<p> sub2.base.func = func2;</p><p> // 多态调用<p> BaseClass *ptr1 = &sub1;<p> BaseClass *ptr2 = &sub2;</p><p> ptr1->func(); // 输出 "This is func1."<p> ptr2->func(); // 输出 "This is func2."</p><p> return 0;<p>}<p>

C++中的多态实现

C++中的多态性通过 虚函数和动态绑定来实现。具体步骤如下:

虚函数

在基类中声明虚函数,通过在成员函数前面加上virtual关键字来标识。

虚函数允许子类对其进行重写(覆盖),从而实现多态。

动态绑定

基于对象的类型来选择调用的函数,而不是基于指针或引用的类型。

在编译时,编译器会根据指针或引用的静态类型进行函数调用;而在运行时,根据指针或引用所指向的对象的实际类型来决定调用哪个函数。

虚函数表(vtable)

编译器会为每一个包含虚函数的类生成一个虚函数表,该表存储了虚函数的地址。

对象的内存布局中会包含一个指向虚函数表的指针,称为虚函数指针(vptr)。

虚函数指针指向当前对象的虚函数表,通过虚函数表来找到具体的虚函数地址。

示例代码如下:

cpp<p>include <iostream></p><p>class Animal {<p>public:<p> virtual void sound() {<p> std::cout << "动物能叫" << std::endl;<p> }<p> virtual ~Animal() {}<p>};</p><p>class Dog : public Animal {<p>public:<p> void sound() override {<p> std::cout << "Woof" << std::endl;<p> }<p>};</p><p>class Cat : public Animal {<p>public:<p> void sound() override {<p> std::cout << "Meow" << std::endl;<p> }<p>};</p><p>int main() {<p> Animal *animal1 = new Dog();<p> Animal *animal2 = new Cat();</p><p> animal1->sound(); // 输出 "Woof"<p> animal2->sound(); // 输出 "Meow"</p><p> delete animal1;<p> delete animal2;</p><p> return 0;<p>}<p>

总结

C语言中通过函数指针和结构体实现多态。

C++中通过虚函数和动态绑定实现多态,利用虚函数表(vtable)来支持运行时多态调用。

这两种方法都可以实现多态,但C++的方法更为灵活和强大,支持继承和运行时类型识别(RTTI)。