簡體   English   中英

在另一個模板基類中實現抽象基類函數

[英]implementing an abstract base class function in another template base class

我有一個Visual Studio 2008 C ++項目,其中有一個從抽象基類繼承的類和另一個在抽象基類中實現功能的模板類。 例如:

class Foo;

struct Buzz
{
    virtual ~Buzz() {};
    virtual void Buzz_Do( Foo* ) = 0;
};

class Base
{
public:
    virtual ~Base() {};
    virtual void Base_Do( Buzz* ) = 0;
};

template< class T >
class Bar
{
public:
    virtual void Base_Do( Buzz* v )
    {
        v->Buzz_Do( static_cast< T* >( this ) );
    };
};

class Foo : public Base, public Bar< Foo >
{
};

int _tmain(int argc, _TCHAR* argv[])
{
    Foo c;
    return 0;
}

不幸的是,這會產生編譯器錯誤:

1>MyApp.cpp(39) : error C2259: 'Foo' : cannot instantiate abstract class
1>        due to following members:
1>        'void Base::Base_Do(Buzz *)' : is abstract
1>        MyApp.cpp(17) : see declaration of 'Base::Base_Do'

我嘗試using Bar< Foo >::Base_Do;添加公共using Bar< Foo >::Base_Do; class Foo ,但這沒有幫助。

有沒有辦法做到這一點,還是我需要在Foo放置一個具體的Base_Do()實現而不使用Bar<>

謝謝PaulH

如果可能,讓Bar<>從Base派生,而Foo僅從Bar<T>派生。

就編譯器所知,您的模板函數實際上並未從基類中實現該函數。 編譯器認為Base::Base_DoBar<T>::Base_Do是兩個完全不相關的函數,而不是一個的實現。

編譯器看到的是, Foo具有兩個(幾乎)同名的函數: Base::Base_DoBar<T>::Base_Do Bar根本不實現Base的接口。

我認為您真正想要的是Bar<T>Base繼承並實現Base_Do 然后讓FooBar<Foo>繼承。

但是盡管如此,您能否更清楚地告訴我們您實際要解決的問題 然后,我們可以提供有關如何解決該問題的建議。 BuzzFoo之間的關系,以及FooBar and Base之間的關系使我感到困惑。

編輯:另請參閱http://www.parashift.com/c++-faq-lite/multiple-inheritance.html#faq-25.10,因為這可能會提供一種仍允許您使用mixin的替代機制。

當一個基礎中定義的函數不相關時,無法使這些基礎中的某個函數替代另一基礎中的同名函數。 那樣行不通。 您要么必須使模板庫繼承自抽象庫,要么在派生類中編寫函數,以在非抽象庫中調用該函數。

您做什么取決於您的問題。 我通常更喜歡前者,但是遇到了不可能的情況(因為我需要的基礎根本不相關)並使用后者。

你有沒有嘗試過:

template< class T , class K>

class Bar: public K
{
public:
    virtual void Base_Do( Buzz* v )
    {
        v->Buzz_Do( static_cast< T* >( this ) );
    };
};

class Foo : public Bar< Foo, Base >
{
};

來自Base Foo派生器,它具有未定義的虛方法。 您可以像我寫的那樣實現它,也可以將派生virtual

由於Foo擴展了Base,因此在實例化Foo( Foo c; )之前,您需要實現Base的所有虛擬方法。 在您的示例中,您需要實現virtual void Base_Do( Buzz* )

看一下錯誤:

> 1>MyApp.cpp(39) : error C2259: 'Foo' :
> cannot instantiate abstract class 1>  
> due to following members: 1>       
> 'void Base::Base_Do(Buzz *)' : is
> abstract 1>        MyApp.cpp(17) : see
> declaration of 'Base::Base_Do'

Foo是一個抽象類。 您不能創建它的實例。 首先實現從基類繼承的所有虛函數。

我有一個Visual Studio 2008 C ++項目,其中有一個從虛擬基類繼承的類和另一個在虛擬基類中實現功能的模板類。

  • 錯誤:您的代碼沒有虛擬基類。

這是您的代碼(在寫這篇文章時):

class Foo;

struct Buzz
{
    virtual ~Buzz() {};
    virtual void Buzz_Do( Foo* ) = 0;
};

class Base
{
public:
    virtual ~Base() {};
    virtual void Base_Do( Buzz* ) = 0;
};

template< class T >
class Bar
{
public:
    virtual void Base_Do( Buzz* v )
    {
        v->Buzz_Do( static_cast< T* >( this ) );
    };
};

class Foo : public Base, public Bar< Foo >
{
};

int _tmain(int argc, _TCHAR* argv[])
{
    Foo c;
    return 0;
}

進一步,

  • 錯誤:純虛擬成員函數Buzz_Do沒有在任何地方實現。

  • 錯誤:您的代碼缺少main功能(我想讀者可以提供)。

  • 錯誤:宏(或類型) _TCHAR在任何地方都沒有定義。

話雖如此,虛擬繼承(您聲稱您的實際代碼正在使用)是對您似乎打算提出的問題的一種可能的答案。

但是,由於您提供的代碼無效且對該代碼的聲明不正確,因此無法合理地說出太多內容。 我注意到其他人還是嘗試過。 也許,如果您很幸運,其中一個答案很合適,但這只是一個機會游戲。

干杯,……

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM