[英]using the return type as pointer to derived class
是否有可能在基類中具有將返回類型作為派生類的指針的函數? 主要目標是供以后使用,在其中使用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.
是的,有可能。 這似乎是一個有問題的設計,但是沒有什么可以阻止您這樣做。 您只需要在引用它之前聲明類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*
作為字符串。
您不能將CreateDerived方法設為純虛擬方法,並在派生類中重寫它嗎? Base類中方法的返回類型為Base ,但派生類中的重寫方法可以返回所需的Derived實例。 我認為這是Template Method-Pattern 。
您的類繼承應始終像is-a關系一樣(Derived-Class is- aBase-Class)。 我認為您的設計建議會破壞該規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.