2011-08-19 47 views
1

我有以下問題:私人的傳承和構造

  • 要繼承一些類如保護(外派生類我不需要從基類中的任何成員或功能)
  • 希望能夠訪問基地構造以某種方式

下面是一個例子(編譯錯誤):

class Animal 
{ 
public: 
    explicit Animal(void){;} 
}; 

class Dog: private Animal 
{ 
public: 
    explicit Dog(void){;} 
}; 

int main(int argc, char *argv[]) 
{ 
    Dog* pDog1 = new Dog(); 

    Animal* pDog2 = new Dog(); 

    return 0; 
} 

我該如何解決這個問題? 謝謝!

編輯:假設基類繼承自一些庫,因此我不能改變它。

+1

什麼叫「希望能夠訪問基類的構造以某種方式」是什麼意思? – YeenFei

+0

@YeenFei,我認爲這是一個語法錯誤。 OP意味着從'Dog *'轉換爲'Animal *';因爲構造函數無論如何都可以訪問。 – iammilind

回答

3

Dog*投給 Animal*作爲一種替代的reinterpret_cast,你可能會暴露的基類用一種方法。如果有一天你決定使用組成,而不是繼承,它不會破壞你的代碼:

class Dog: private Animal 
{ 
public: 
    explicit Dog() {} 
    Animal * GetAnimal() { return this; } 
}; 

int main(int argc, char *argv[]) 
{ 
    Dog* pDog1 = new Dog(); 
    Animal * pDog2 = pDog1->GetAnimal(); 
    return 0; 
} 
+0

不錯,優雅。謝謝! – sivic

1

要糾正你的編譯器錯誤簡單地做:

Animal* pDog2 = reinterpret_cast<Animal*>(new Dog()); 
3

要繼承一些類如保護

那麼理論上它應該是,class Dog : protected Animal

現在,對於任何非public無效,Base *p = new Derived;無效;因爲Base*變得無法訪問。如果沒有reinterpret_cast<>或C風格的演員,則無法完成。

我會建議不要使用強制轉換。理想情況下,對於private/protected繼承,基本指針不應該包含一般範圍內的派生指針。爲了解決你的問題:

  1. 要麼使public繼承
  2. 更改設計,在不需要
+0

或3.使用捷姆諮詢:)感謝您的回答! – sivic