2017-01-26 111 views
1

我在想,是否可以在類AbstractBase中聲明純虛函數,並在Derived中使Base類成員可見,因此它將使用Base的成員,而不是查找實現在Derived。到目前爲止,我嘗試使用using來嘗試使Base的成員可視化,但它不會編譯,因爲在這種情況下,查找似乎忽略了使用。這可能嗎?這裏是我的代碼:訪問抽象基類中的另一個基類成員

#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