2017-01-26 10 views
1

クラスAbstractBaseで純粋仮想関数を宣言でき、Baseのメンバーを使用し、実装を探すことがないようにBaseクラスメンバーをDerivedに表示することができますか? Derivedにあります。これまでのところ、Baseのメンバーは、usingを使用しようとするとビジュアルになりましたが、ルックアップはこのケースでは無視されているように見えるため、コンパイルされません。これはまったく可能ですか?ここに私のコードは次のとおりです。抽象基本クラスから別の基本クラスメンバーにアクセス

#include <iostream> 

using namespace std; 

class AbstractBase { 

public: 
    AbstractBase(){} 
    virtual ~AbstractBase(){} 

protected: 
    virtual void f() = 0; 


}; 

class Base { 

public: 
    Base(){} 

protected: 
    void f() {cout << "called Base's f()" << endl;} 

}; 

class Derived : public Base, public AbstractBase { 

public: 
    Derived(){} 
    //using Base::f; /*this won't compile*/ 
private: 
    void f(){} /*Access Base's f() here rather than implement*/ 


}; 

int main() 
{ 
    Derived d; 
} 

答えて

2

使用::オペレータ:

class Derived : public Base { 

public: 
    Derived(){} 
private: 
    void f(){ Base::f() } 
}; 

また、あなたがAbstractBaseから継承する必要はありません。

+0

そのように簡単です。これは簡単なケースです。これは 'Derived'を' AbstractBase'として再び使うときに便利です。ありがとう! – tobilocker

+0

'::'は演算子ではありません。 –

+0

@JonathanMeeそれは何ですか?私にとっては、これは「名前空間演算子」とも呼ばれます。 – tobilocker

1

f()は純粋仮想であるが、デフォルトの実装を提供したいと思っています。この場合、この方法を実現することができます。

#include <iostream> 

using namespace std; 

struct AbstractBaseWithDefaultF 
{ 
    virtual ~AbstractBaseWithDefaultF() = default; 
    virtual void f() = 0; 
}; 
void AbstractBaseWithDefaultF::f() 
{ 
    cout << "called AbstractBaseWithDefaultF's f()" << endl; 
} 

struct Derived : AbstractBaseWithDefaultF 
{ 
    void f() override 
    { 
     AbstractBaseWithDefaultF::f(); 
     cout << "called Derived's f()" << endl; 
    } 
}; 

int main() 
{ 
    Derived d; 
    d.f(); 
} 

出力:

called AbstractBaseWithDefaultF's f() 
called Derived's f() 

はここlive Wandbox exampleです。

+0

@ Jarod42はい、確かです。修正されました。スピード - 応答アドレナリン - ラッシュは非難することです:) – AMA

関連する問題