2011-07-09 116 views
2

不知道如果我能有兩種類看起來像這樣:傳承與融合 - 基類的指針指向派生類

//file: Small.h 
#pragma once 
#include "Little.h" 

class Small : 
    public Little 
{ 
public: 
    Small(void){} 
    ~Small(void){} 

}; 

//file: Little.h 
#pragma once 
#include <iostream> 
#include "Small.h" 

using namespace std; 

//class Small; 
class Little 
{ 
public: 
    Little(){ s = 0; } 
    void print(){ cout << "oops!" << endl; } 
    Small* s; 
}; 

現在我的問題:當我想創建一個「Small」類型的對象並調用它的「print()」函數,VS-2010說「class'Small'沒有名爲'print()'的成員。什麼是解決方案?

回答

0

下面應該可以工作,但是,您應該以這種方式構建類,基類應該確實具有派生類類型的成員。

但是,由於成員只是一個指針,代碼仍然應該編譯和工作,但是您要求錯誤。

與你的代碼的問題是,你創建類一點一點地bfroe創建前級小必須定義小

你應該這樣做在一個文件中,如下所示,因爲它們是互

//file: SmallLittle.h 
#pragma once 
#include <iostream> 

using namespace std; 

class Small; 

class Little 
{ 
public: 
    Little(){ s = 0; } 
    void print(){ cout << "oops!" << endl; } 
    Small* s; 
}; 

class Small : 
    public Little 
{ 
public: 
    Small(void){} 
    ~Small(void){} 

}; 

但是,由於Small是Little的成員類型,因此您可能最好創建如下的單個類,使用代碼的唯一原因是您可以使用Small代碼,其中Small沒有定義或使用。但是在這種情況下,您最好使用void *類型的指針。

如下

//file: Small.h 
#pragma once 
#include <iostream> 

using namespace std; 

class Small; 

class Small 
{ 
public: 
    Small(){ s = 0; } 
    void print(){ cout << "oops!" << endl; } 
    Small* s; 
    ~Small(void){} 
}; 

還有你,我不認爲你需要發設置爲0,因爲這是空,直到你使用新分配的指針創建一個指針,它應該是值。

+0

謝謝你,但我找到了另一種方式。我的這些類的目的是訪問基類函數「print()」。但是,如果我們將「Little」中的指針類型更改爲「Little *」,我們仍然可以爲其繼承分配一個類型爲「Small *」的指針。所以,我們可以使用這個函數「print()」。再次感謝你。 –

相關問題