c++ - 使用基类的引用访问派生类的私有(private)成员函数

标签 c++ interface private-members

看一下代码。我的界面如下所示:

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/

相关文章:

c++ - Visual Studio 2013 错误 LNK2019

c++ - short(expression) 是什么意思?

c# - 高斯模糊C#实现(类似OpenCV)

c++ - 为什么我可以在私有(private)类型上使用 auto ?

python - 为什么我不能在 Python 中访问父类(super class)的私有(private)变量?

Javascript 私有(private)方法——内存影响是什么?

c++ - 转换迭代器和 const_iterators

java - 关于Java中的接口(interface)和泛型的问题: type mismatch error

go - 在 Golang 中无需声明结构即可从接口(interface)获取接口(interface)字段值

pointers - X不实现Y(…方法具有指针接收器)