我有几个相互关联的类,将由多种不同的算法使用

例:

struct B;

struct A {
    B* parent;
};

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


每种算法都可能希望根据它们对它们的处理来专门化这些类,因此大概我们应该从A和B派生它们
struct Aderived : A {...};
struct Bderived : B {...};

但是Aderived中的方法将想要将parent视为Bderived*(以访问Bderived添加的方法或成员),而Bderived将想要将children的元素视为Aderived*

1)AderivedBderived中的方法是否有一个好的方法,可以避免每次想要分别访问parentchildren方法时都必须对BderivedAderived进行静态强制转换。

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 >
{
  //...
};

关于c++ - 互相关C++类中多态的最佳实践?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57261506/

10-12 01:55