在以下示例中,是否有一种很好的方法可以从A::foo()
拨打B::bar()
?
class A {
protected:
void foo() {}
};
class B : public A {
public:
void bar(A& a) { // edit: called with &a != this
a.foo(); // does not work
}
};
除了声明B
成为A
的朋友之外,我想不出任何其他事情,但是如果有更多的课程可能会变得非常丑陋。
有什么想法吗?
答案 0 :(得分:4)
是的,您可以使用基类功能。
class A {
protected:
void foo() {}
void do_other_foo(A& ref) {
ref.foo();
}
};
class B : public A {
public:
void bar(A& a) { // edit: called with &a != this
this->do_other_foo(a);
}
};
答案 1 :(得分:3)
为什么要传递A类对象?你可以这样做:
class B : public A {
public:
void bar() {
foo();
}
};
或者,像这样
class B : public A {
public:
void bar() {
A::foo();
}
};
答案 2 :(得分:1)
这是一种给予“受保护”访问的方法,允许通过任何派生类或对象进行调用。 它使用受保护的令牌类型,需要解锁特权方法:
struct A
{
protected:
//Zero sized struct which allows only derived classes to call privileged methods
struct DerivedOnlyAccessToken{};
public: //public in the normal sense :
void foo() {}
public: //For derived types only :
void privilegedStuff( DerivedOnlyAccessToken aKey );
};
struct B: A
{
void doPrivelegedStuff( A& a )
{
//Can create a token here
a.privilegedStuff( DerivedOnlyAccessToken() );
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
a.foo();
a.privilegedStuff( A::DerivedOnlyAccessToken() ); // compile error.
B b;
b.doPrivelegedStuff( a );
return 0;
}
这不是我的想法。我在某处读到了它。对不起,我不记得是谁的狡猾想法。
我希望编译器可以忽略aKey参数。