看一下代码。我的界面如下所示:
class Abstract_base {
public:
virtual ~Abstract_base() {}
virtual void f1 () = 0;
virtual void f2 () = 0;
};
基类如下所示:
class Base : public Abstract_base {
public:
virtual ~Base() {}
virtual void f1 () override { cout << "f1" << endl; }
virtual void f2 () override { cout << "f2" << endl; }
};
我有两个派生类,如下所示:
class Derived_1 : public Base {
public:
virtual ~Derived_1() {}
private:
virtual void f2 () override { cout << "Derived_1::f2 ()" << endl; }
};
class Derived_2 : public Base {
public:
virtual ~Derived_2() {}
private:
virtual void f1 () override { cout << "Derived_2::f1 ()" << endl; }
};
最后我有 Handler 类,如下所示:
class Handler {
public:
Handler (Abstract_base& b) : base (b) {}
virtual ~Handler() {}
void process_1 () {
base.f1 ();
}
void process_2 () {
base.f2 ();
}
private:
Abstract_base& base;
};
main.cpp 看起来像这样:
int main (int argc, char** argv) {
Derived_1 der1;
der1.f2 ();
Derived_2 der2;
der2.f1 ();
Handler handler1 (der1);
handler1.process_2 ();
Handler handler2 (der2);
handler2.process_1 ();
return 0;
}
当然代码不会编译,因为 der1.f2 () 和 der2.f1 () 是私有(private)的,但是如果我注释掉这两个指令并保留 handler1.process_2 () 和 handler2.process_1 () 指令,代码将编译并产生输出:
Derived_1::f2 ()
Derived_2::f1 ()
问题:
如何防止使用 Abstract_base 类的引用来调用这两个私有(private)成员函数?我只是不希望用户有权访问 Derived_1 中的 f2 () 和 Derived_2 中的 f1() 。
据我所知,我无法对 Derived_1::f2 () 和 Derived_2::f1 () 使用删除关键字。
你能为我建议一个解决这个问题的方法吗?
解决方案
我知道解决方案之一可以使 Handler 成为这样的模板类:
template <class B>
class Handler_templ {
public:
Handler_templ (B& b) : base (b) { }
virtual ~Handler_templ() {}
void process_1 () {
base.f1 ();
}
void process_2 () {
base.f2 ();
}
private:
B& base;
};
并像这样使用它:
Handler_templ<Derived_1> h1 (der1);
Handler_templ<Derived_2> h2 (der2);
h1.process_2 ();
h2.process_1 ();
令我惊讶的是为什么使用Handler类我能够调用这些私有(private)成员函数?如果有任何建议,我将非常感激。
真诚的, 阿图尔
最佳答案
您无法阻止使用对 Abstract_base
类的引用来调用这两个私有(private)成员函数。当通过基类的引用或指针访问方法时,派生类的访问权限将不被考虑。 (编译器怎么知道这一点?)
根据里氏替换原理(LSP),
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
关于c++ - 使用基类的引用访问派生类的私有(private)成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26988920/