2012-02-14 115 views
0

我有一個類庫很多。我想修改某個類的一個虛擬方法的行爲。我試圖簡化,我有什麼,那就是:在C++中重載虛擬方法

#include <iostream> 

using namespace std; 

class B; 

class A { 
    public: 
    A(B& b_) : b(b_) {}; 

    B& b; 

    virtual void printon() { 
     cout << "Test virtual printon A\n" << endl; 
    } 
    void print() { 
     cout << "Test print A\n"; 
     printon(); 
    } 
}; 

class B { 
    protected: 
    A a; 
    public: 
    B() : a(*this) {}; 

    void print() { 
     a.print(); 
    }; 
}; 

而在我的節目,我可以用它喜歡:

int main() { 
    B* b = new B(); 
    b->print(); 
    return 0; 
} 

其實方法a.printon()從一些其他的代碼調用,不同的條件,並不打印任何東西(它做了一些其他的行爲)。我需要重寫此方法來執行其他操作,例如,打印「test2」。

我可以創建一個派生類newA

class newA : public A { 
    public: 
    newA(B& b_) : A(b_) {}; 

    virtual void printon() { 
     cout << "Test printon newA"<< endl; 
    } 
}; 

而且我不知道,下一步怎麼辦。也許創建一個類newB,如:

class newB : public B { 
    public: 
    newB() : B() {}; 
}; 

但如何讓類型A行爲B.anewA類型?

+0

退房鑄造,說不定動態轉換可以幫助 – 2012-02-14 08:37:55

回答

2

B包含A的價值,這就排除了使用多態的(如果你試圖將一個newA設置成A對象,你會得到對象切片。如果你希望你的B能夠使用的A衍生版本,你」 ð需要通過(智能)指針將其保存。

+1

http://stackoverflow.com/questions/2432683/what-does-slicing-mean-in-c – Arafangion 2012-02-14 06:56:51

+0

謝謝,我試着學習,爲什麼它是按價值存儲的。 – 2012-02-14 07:39:52