2016-06-13 32 views
2

是否可以執行以下操作:
我的基類有3個純虛函數。我的派生類實現了這些虛函數中的2個,並從另一個實現最後第3個虛函數的類繼承。允許其他基類實現虛函數

我目前的代碼不會編譯,所以我認爲這是無效的?雖然如果我能以某種方式使用這種方法,那將會很棒。以下是我對這種方法的實際應用/使用。

對於我可以用來實現此功能的不同方法有何建議?

class ListBox 
{ 
public: 
    virtual void onScroll() = 0; 
    virtual void foo() = 0; 
    virtual void bar() = 0; 
}; 

class DragScrollHandler 
{ 
public: 
    void onScroll() 
    { 
     ... 
    } 
}; 

class HorzListBox: public ListBox, public DragScrollHandler // could also do public HoverScrollHandler, etc. 
{ 
public: 
    void foo() override 
    { 
     printf("foo\n"); 
    } 

    void bar() override 
    { 
     printf("foo\n"); 
    } 

    HorzListBox() 
     : ListBox(), DragScrollHandler() 
    { 

    } 
}; 

回答

3

ListBoxDragScrollHandler先驗不同的概念,所以跨多重繼承沒有種類的鏈接。我的意思是,在以某種方式繼承的虛擬onScroll與另一個不相關(到另一個)分支上的實現onScroll之間設置鏈接不是自動的。

您可以定義它HorzListBox調用繼承的實現:

void onScroll() override { 
    DragScrollHandler::onScroll(); 
} 

這將履行合同:實現抽象和使用繼承的實現。

,但可能是最好的方式(你的情況)是分離的概念,並有一個Scrollable

class Scrollable { 
public: 
    virtual void onScroll()=0; 
}; 

class ListBox: virtual public Scrollable { 
public: 
    virtual void foo()=0; 
}; 

class DragScrollHandler: virtual public Scrollable { 
public: 
    void onScroll() override {...} 
}; 

class HorzListBox: public ListBox, public DragScrollHandler { 
public: 
    void foo() override {...} 
}; 
1

了不同的方法,我可以用它來實現這一功能的任何建議?

使派生類實現傳遞給其他基類實現。

class HorzListBox: public ListBox, public DragScrollHandler 
{ 
public: 
    void foo() override 
    { 
     printf("foo\n"); 
    } 

    void bar() override 
    { 
     printf("foo\n"); 
    } 

    void onScroll() override 
    { 
     DragScrollHandler::onScroll(); 
    } 

    HorzListBox() 
     : ListBox(), DragScrollHandler() 
    { 

    } 
}; 
-1

我當前的代碼將無法編譯,所以我想這是不是有效?

當然它不會編譯!派生類不重寫抽象基類的所有純虛函數,反過來也自己變成抽象類。這意味着Derived類不能實例化,因此編譯時錯誤。

因此,在你的情況下,類HorzListBox也是一個抽象類,因爲它不會覆蓋類ListBox的所有PVF。

請重新考慮這些行並相應地修改您的代碼。

1

了不同的方法,我可以用它來實現這一功能的任何建議?

對於好奇的緣故,你可以使用類似下面的一個混入基礎的方法:

struct ListBox { 
    virtual ~ListBox() { } 
    virtual void onScroll() = 0; 
    virtual void foo() = 0; 
    virtual void bar() = 0; 
}; 

template<typename T> 
struct DragScrollHandler: T { 
    void onScroll() override { } 
}; 

template<typename T> 
struct HorzListBox: T { 
    void foo() override { } 
    void bar() override { } 
}; 

int main() { 
    ListBox *lb = new HorzListBox<DragScrollHandler<ListBox>>{}; 
} 
相關問題