首页 > 解决方案 > 相关 C++ 类中多态性的最佳实践?

问题描述

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

例子:

struct B;

struct A {
    B* parent;
};

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

每个算法都可能希望根据它们对它们所做的事情来专门化这些类,所以我们推测它们应该从 A 和 B 派生

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

但是 in 中的方法Aderived希望将其parent视为Bderived*(访问由 添加的方法或成员Bderived)并且Bderived希望将其元素children视为 as Aderived*

1) 是否有一种方法可以很好地Aderived避免Bderived在每次他们想要分别访问 和 的方法时都parent必须进行静态强制转换。childrenBderivedAderived

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; }
};

标签: c++inheritance

解决方案


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

推荐阅读