gpt4 book ai didi

c - 在调用父方法时使用 void * 作为方法中的 this 指针与 my_class * 和强制转换相比有哪些利弊?

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:42 25 4
gpt4 key购买 nike

我目前在 C 中使用 OOP 技术,并且我使用了子类的已知习惯用法,子类在其结构中有一个父类实例,如下所示:

struct parent{
void (*doSomething)(struct parent *parent);
};

struct child{
struct parent base;
int (*doSomethingCooler)(struct child *child);
};

现在,我的方法以它们所属的类为前缀:

void parent_doSomething(struct parent *parent);
int child_doSomethingCooler(struct child *child);

随着重载,我有

void child_doSomethingCool(struct parent *parent);

我在子构造函数上设置为 parent->doSomething。

无论如何,当我有一个子实例,我想调用父方法时,问题就出现了。立即,我必须将我的实例指针强制转换(类似于 C 中的 dynamic_cast)到父类类型,这会很快污染我的代码。

第二个想法是定义所有方法来接收 void * "this"参数,并在内部将它们转换为正确的类。这简化了客户端代码的使用,但将代码暴露给严重的错误,例如传递无效引用或错误类型的引用。

每种实现方式的优缺点是什么?

最佳答案

借助 C11 的新类型泛型特性,您可以统一访问父部分:

#define getParent(X)        \
_Generic((X), \
parent*: (X), \
child*: (&(X)->base)))

然后你可以用宏重载你的函数名

#define doSomething(X) doSomething(getParent(X))

正如您从这些示例中看到的那样,这对于通过指针调用“方法”的 OO 表示法不太适用,例如 p->doSomething(),但这可能是一个开始。

关于c - 在调用父方法时使用 void * 作为方法中的 this 指针与 my_class * 和强制转换相比有哪些利弊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12147474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com