2014-01-29 87 views
-2

這是一個簡單的問題(我認爲)。我只是不知道這件事,我正在尋找一個好的解決方案太:)C++:繼承優先

比方說,我有這樣的:

class Base { 
    public: 
    virtual ~Base() {} 
    virtual Base& connect(Base &b) = 0; 
} 

class Derived: public Base { 
    public: 
    virtual ~Derived() {} 
    virtual Base& connect(Base &b) 
    { 
     // do_something 
    } 
} 

// Name is a class that is basically a String and assign it to any A or B object. 

class A: public Derived { 
    public: 
    A(name N) { ... } 
    virtual ~A() {} 
} 

class B: public Derived { 
    public: 
    B(name N) { ... } 
    virtual ~B() {} 
    A& connect(A &a) 
    { 
     // do something else 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    A objA("A"); 
    B objB("B"); 

    // Here's where is my issue 
    objB.connect(objA); 
} 

當我打電話objB.connect(objA),它實際上是調用Base& connect(Base &b)。我明白,因爲他們都是Base的孩子,並且都有Derived中定義的connect()。但事情是,我希望每當我有objB.connect(objA)時,它應該調用A& connect(A &a)來代替。

我想知道是否有辦法以我想要的方式擁有它。

謝謝:)

UPDATE

我編輯的這一點,因爲我有幾個錯別字。我沒有複製粘貼代碼,因爲它比我希望的複雜得多。 <希望它夠了。

+3

顯示編譯的代碼。 'objA = new A();'用指針初始化一個對象。你的bug可能是對引用或強制轉換(或其他類型問題)的細微誤用,所以我們需要*精確*代碼來重現它。 – Angew

+0

你在連接(A&a)的定義中忘記了'virtual' – Thomas

+0

這個東西不會編譯'A objA = new A()'。我用過的所有編譯器都拒絕編譯這一行。你是如何得到你的輸出的? – DumbCoder

回答

2

您的代碼不會編譯。以下是編譯和結果,你的願望代碼:你可以選擇調用基於指針類型,其中connect版本:

class Base { 
    public: 
    virtual ~Base() {} 
    virtual Base& connect(Base &b) = 0; 
}; 

class Derived: public Base { 
    public: 
    virtual ~Derived() {} 
    virtual Base& connect(Base &b) 
    { 
     qDebug() << "Baseconnect"; 
    } 
}; 

class AA: public Derived { 
    public: 
    AA() {} 
    virtual ~AA() {} 
}; 

class BB: public Derived { 
    public: 
    BB() {} 
    virtual ~BB() {} 
    AA& connect(AA &a) 
    { 
     qDebug() << "Aconnect"; 
    } 
}; 

例如:

int main(int argc, char *argv[]) 
{ 
    AA* aaptr = new AA; 
    BB* bbptr = new BB; 
    bbptr->connect(*aaptr); // version from BB is called 
    Derived* dptr = new BB; 
    dptr->connect(*aaptr); // version from Derived is called 
    // ... 
} 

作爲一個側面說明,請始終確保您的代碼編譯和問題已定義良好。否則,您可以縮小回答問題的機會。

+0

謝謝@piotruś。你的回答讓我更接近解決我的問題。它真的幫了大忙! – makeMonday