相互关联的C 类中多态性的最佳实践

Best practice for polymorphism in interelated C++ classes?

本文关键字:最佳 多态性 关联      更新时间:2023-10-16

我有几个相互关联的类,这些类将由多个不同算法

使用

示例:

struct B;
struct A {
    B* parent;
};
struct B {
    std::vector<A*> children;
};

每种算法可能希望根据它们对它们的所作所为来专业化这些类

struct Aderived : A {...};
struct Bderived : B {...};

但是Aderived中的方法将希望将parent视为Bderived*(访问Bderived添加的方法或成员(,并且Bderived将需要将children的元素视为Aderived*

1(在AderivedBderived中的方法是否有很好的方法,可以避免每次要访问BderivedAderived的方法时必须在parentchildren上进行静态铸件。

。 。

2(您甚至如何获得类似的东西来编译,因为您无法转发宣布一类是从另一个派生的...

struct Aderived : public A {
    int a;
    void x() { static_cast<Bderived*>(b)->b = 1; }   // ERROR
};
struct Bderived : public B {
    int b;
    void x() { static_cast<Aderived*>(avec.back())->a = 1; }
};

将a和b定义为模板:

template < class T1 >
struct A
{
    T1* parent;
};
template < class T2 >
struct B 
{
    std::vector < T2* > children;
};

何时继承去:

struct Aderived : public A < Bderived >
{
  // ...
};
struct Bderived : public B < Aderived >
{
  //...
};

只需声明将 B*A成员函数声明为 Bderived*,然后在定义 Bderived之后定义它们:

struct Aderived : public A {
    int a;
    void x();
};
struct Bderived : public B {
    int b;
    void x() { static_cast<Aderived*>(avec.back())->a = 1; }
};
inline void Aderived::x() { static_cast<Bderived*>(b)->b = 1; }