2013-11-29 19 views
0

我怎麼可能做到這一點:Polymorphism->錯誤:「從派生類的基類沒有已知的轉換」

class Base 
{ 
public: 
    int a, b, c; 
    void function(); 
    ... 
}; 

class Derived1 : 
    private Base 
{ 
public: 
    int d, e, f; 
    ... 
}; 

class Derived2 : 
    private Base 
{ 
public: 
    void addObject(const Base* obj); 
    ... 
}; 

注意,我繼承了它作爲私人


然後我想這樣做:

Base* d1 = new Derived1(); 
Base* d2 = new Derived2(); 

d2->addObject(d1); 

這裏是我得到的相關問題編譯:

C:\test\test.cpp||In function 'void init()':| 
C:\test\test.cpp|423|error: no matching function for call to 'Derived2::addObject(const Base*)'| 
C:\test\test.cpp|423|note: candidate is:| 
C:\test\test.h|29|note: void Derived2::addObject(const Base*)| 
C:\test\test.h|29|note: no known conversion for argument 1 from 'Derived1 {aka ... }' to 'const Base* {aka ... }'| 
||=== Build finished: 1 errors, 0 warnings (0 minutes, 9 seconds) ===| 

我想通過一些派生類繼承Base私人的原因是隱藏在公衆範圍內一些Base的成員/功能。

我不想直接訪問一些Base::functions()在公共範圍內,但沒有別的,使用Derived::function(),而不是操縱其數據成員,讓派生類決定將執行什麼樣的動作。

不過,我能想到的覆蓋從基類中的每個功能,我不希望直接修改公開範圍,但其不靈活,在我的情況太多了。

我的意思是:

class Base 
{ 
public: 
    //I must think in advance deciding whether if it'll be virtual or not. 
    [virtual] void f1(int); 
    [virtual] void f2(int); 
    [virtual] void f3(int); 
    //and many more... 
}; 

class Derivedn : 
    private Base 
{ 
public: 
    //hmm, I should not neglect to override certain base' member functions 
    //that I don't want to access in public scope. 
    void f1(int); 
}; 

我想避免這種情況,但...

是否有其他方法可以讓我做的,與此類似,沒有覆蓋每個Base::function() S'

回答

0

我覺得你的代碼應閱讀:

d2.addObject(&d1); // Note the "&" 

當編譯器說,有從Derived1實例沒有可能轉換爲一個const指針的Base一個實例。

+0

AHM ,對不起,它是一個錯字。 – mr5

+1

編譯器是否報告沒有錯字的相同錯誤? – DrFred

+0

我沒有複製/粘貼代碼,這是我得到一個錯字。是。 – mr5

2

這不起作用的原因是,私下繼承不構成「是」的關係。實際上,它比繼承更接近構圖,因爲派生類在不獲取接口的情況下獲取基礎的實現。

The reason I want to inherit the Base as private by some derived classes is to hide some Base's members/functions in public scope.

這是私下繼承的錯誤原因。 Here are some good answers to the question when you should inherit privately.

Is there any other way I can do, similar to this one, without overriding each Base::function()s?

您不需要重寫的基本的功能,每一個,除非是純虛(也被稱爲「抽象」)的。您的基類可以爲其虛函數提供空實現,以便派生類可以決定提供哪些功能。

+0

當然,我不想繼承每個派生類的每個'Base :: functions()',但在我的實現中,我應該小心w/c的'Base :: function()'我必須重寫時某些功能應該在公共範圍內執行。既然我能做到這一點,我認爲這對我來說不是一個好選擇。 – mr5

+0

@ mr5請注意,您可以選擇性地將一些繼承的函數設爲私有([demo](http://ideone.com/G8uvR5))。 – dasblinkenlight

+0

我真的很喜歡讓繼承是私人的,所以我可以避免太多'功能重寫'。但是,如果我這樣做,我不能做'd2-> addObject(d1);'的東西。在提前考慮時,決定是否將'base member function'聲明爲'virtual'或者不對我來說似乎是個問題。 – mr5

0

不知道你想做的,但多態性也正是這樣,讓你在派生類中重寫基本功能:

class Base 
{ 
public: 
    int a, b, c; 
    virtual void function(); 
    ^^^^^^^ 
    ... 
}; 

class Derived1 : 
    public Base 
{ 
public: 
    int d, e, f; 
    virtual void function(); // do derived version of Base::function 
}; 

,現在你可以從數據庫存取功能的衍生版本對象

+0

問題不在於'function',而在於'addObject'。 – Shoe