0

是否可以在基类中有一个函数,其返回类型为指向派生类的指针?主要目标是供以后在您使用BaseDerivedClass 设置值的地方使用。

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.
4

2 回答 2

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*for 字符串。

于 2013-03-25T10:00:20.967 回答
0

你不能让你的 CreateDerived 方法纯虚拟并在派生类中覆盖它吗?Base 类中方法的返回类型为Base,但派生类中的重写方法可以返回您需要的Derived实例。我认为那是Template Method-Pattern

你的类继承应该总是表现得像一个 is-a 关系(Derived-Class is-a Base-Class)。我认为你的设计建议有点破坏这条规则。

于 2013-03-25T10:11:04.050 回答