[英]Restricting access to derived class for a pure virtual function in c++
class A
{
public:
void virtual magic() = 0;
void bar()
{
magic(); // this should be legal
}
};
class B: public A
{
public:
void magic()
{
cout<<"implement magic here"<<endl;
}
};
class C: public B
{
void foo()
{
magic(); // this should not be allowed, i.e. create compile-time error
}
};
因此, B
的純虛基類A
應該可以訪問magic()
,但不能訪問任何B
派生類C
這可以使用訪問說明符和/或朋友聲明或以任何其他方式實現嗎?
基本上,您無法降低虛擬方法的可見性。 一旦它在A
公開,就沒有任何整潔的方法可以使它在任何派生類中受到保護或私有。
如果您有權訪問class A
,請將magic
訪問權限更改為private
:
private:
void virtual magic() = 0;
然后讓B班成為A班的朋友:
class A
{
friend class B;
您真正想要的是使用所謂的模板方法模式,最有可能將公共接口與繼承的實現細節分開 。
您的公共接口應使用非虛方法。 虛擬方法應該都是私有的。 然后基類中的接口可以強制執行不變量並進行樣板工作。 派生類仍然可以覆蓋虛方法 ,它們不能直接調用它。
僅當派生類需要調用虛方法的基本實現時,才能使虛方法受到保護。 這幾乎都是。
基類析構函數應該是公共的和虛擬的,或者是受保護的和非虛擬的。 前者當您希望使用基類接口執行銷毀時。 現在 ,這真的全部:)
具體來說:
#include <iostream>
#include <cassert>
using namespace std;
class A
{
// we do magic without sprinking any dust, but optionally we could sprinkle some beforehand
void virtual sprinkle() {};
void virtual magic(int) = 0;
public:
void doSomeMagic(int power) {
assert(power > 3 and power < 8);
sprinkle();
magic(power);
}
virtual ~A() {}
};
class B: public A
{
void magic(int power) {
cout << "B: did magic of with power=" << power << endl;
}
};
class C : public B
{
void sprinkle() {
cout << "C: also sprinked some dust before doing the magic" << endl;
}
};
int main()
{
B b;
C c;
b.doSomeMagic(5);
c.doSomeMagic(6);
return 0;
}
B: did magic of with power=5
C: also sprinked some dust before doing the magic
B: did magic of with power=6
正如Dave S的評論所示,更改C :: magic()的訪問說明符:
class A
{
public:
void virtual magic() = 0;
};
class B: public A
{
public:
void magic()
{
cout<<"implement magic here"<<endl;
}
};
class C:public B
{
private:
void virtual magic(){};
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.