C ++关于继承层次结构

时间:2010-09-26 02:12:13

标签: c++ inheritance

有一个C代码,我们试图将其转换为C ++代码。有两个继承层次结构,由C通过switch..case管理。它已被转换为在C ++中使用虚函数。现在,这两个层次结构必须相关。例如,A类涉及A1,B类涉及B1 ....其中A,B,C属于层次1,A1,B1,C1属于层次2。    在C代码中,这是通过在A,B,C中存储层次结构2的标记字段(或switch..case中使用的类型字段)来实现的。有人可以指导我如何干净地实现这个C ++吗?

在C

enum NodeTag1
{
  A_Node
  , B_Node
  ....  
};

enum NodeTag2
{
   A1_Node
   , B1_Node
   ....
};

struct Node
{
   NodeTag1 tag1;
};

struct A
{
     NodeTag1 tag1;
     NodeTag2 tag2;
     ..other members...
};

struct B,C看起来都一样。

现在假设有10个函数(f1,f2 ..)使用NodeTag1进行切换..情况 在C ++中

class Node {  //10 virtual functions (f1,f2 ..)};
class A : public Node { // 10 virtual function( f1, f2.. ) };
class B : public Node { // 10 virtual function( f1, f2.. ) };

现在有一个这样的函数,从层次结构1的实例调用。

int decide( NodeTag2 tag2 )
{
   switch(tag2)
   {
      ...
   }
}

我如何在C ++中实现这一目标?

谢谢, 戈库尔。

2 个答案:

答案 0 :(得分:1)

如果通过“涉及”表示创建常用方法是factory method。这是A,B和C类中的虚函数,它返回A1,B1或C1的对象。

class A  
{
  virtual A1 GetRelated() { return new A1(); };
}

class B: public A
{
  A1 GetRelated() { return new B1(); };
}

class A1;
class B1: public A1;
..

这当然假设A和A1类是B类和B1类的父类,您的层次结构可能不同。

答案 1 :(得分:1)

如果您不想在运行时创建对象。您可以使用以下方法。只创建一次对象。 由于您不需要访问类的成员,单个对象将完成您的工作;

class A
{

public:

 virtual f()
 {
  printf("A");
 }

 static A* behaveLikeA();

 static A* behaveLikeB();
};

class B : public A
{

public:

 virtual f()
 {
  printf("B");
 }
};

A* A::behaveLikeA()
{
 static A ag;
 return &ag;
}

A* A::behaveLikeB()
{
 static B bg;
 return &bg;
};


int main(int argc, char* argv[])
{

 A* b = A::behaveLikeB();
 b->f();

 b = A::behaveLikeA();
 b->f();
 return 0;
}