使用返回类型作为派生类的指针

时间:2013-03-25 09:52:21

标签: c++ class pointers

是否有可能在基类中有一个函数,它将返回类型作为派生类的指针?主要目标是以后使用BaseDerived类来设置值。

Base B1;
B1.SetName("nameOfBase");
Derived* D1 = B1.CreateDerived("DerivedFromBase");//CreateDerived method will be in class Base
D1->SetMinPoint(0,1);//this method will be implemented in derived class
D1->SetMaxPoint(4,4);//this method will be implemented in derived class

我在实施方面遇到问题,我做了像

这样的事情
class Base
{
public:
  Base();
  bool SetName(char*);//or SetName(string)
  Derived* CreateDerived(char*); // or Derived* CreateDerived(string)
  ~Base();
protected:
  char baseName[20];// or string baseName
  Derived* derivedPtr[5];
};

class Derived: public Base
{
public:
  Derived();
  bool SetName(char*);//the name given in Derived* CreateDerived(char*) will be set here
  ~Derived(); 
};

当我尝试这样做并运行程序时,我得到错误,如

// Derived* CreateDerived(char*); // or Derived* CreateDerived(string)
error C2143: syntax error: missing ';' before '*'
error C4430: missing type identifier: int assumed.

2 个答案:

答案 0 :(得分:1)

是的,这是可能的。这似乎是一个有点可疑的设计,但没有什么能阻止你这样做。您只需要在引用它之前声明类Derived

class Derived;  //forward declaration here

class Base
{
public:
  Base();
  bool SetName(char*);//or SetName(string)
  Derived* CreateDerived(char*); // or Derived* CreateDerived(string)
  ~Base();
protected:
  char baseName[20];// or string baseName
  Derived* derivedPtr[5];
};

class Derived: public Base
{
public:
  Derived();
  bool SetName(char*); //don't forget semi-colon
  ~Derived(); 
};

正如@psur所提到的,你在SetName之后也错过了一个分号。

我强烈建议在C ++中使用std::string代替char*

答案 1 :(得分:0)

难道你不能让你的CreateDerived方法纯虚拟并在派生类中覆盖它吗? Base类中方法的返回类型为 Base ,但派生类中的重写方法可能会返回您需要的 Derived 实例。我认为这是模板方法模式

您的类继承应始终表现为is-a关系(Derived-Class is -a Base-Class)。我认为你的设计建议会破坏这条规则。