是否有可能在基类中有一个函数,它将返回类型作为派生类的指针?主要目标是以后使用Base
和Derived
类来设置值。
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.
答案 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)。我认为你的设计建议会破坏这条规则。