Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 公共接口方法的私有实现_C++_Interface - Fatal编程技术网

C++ 公共接口方法的私有实现

C++ 公共接口方法的私有实现,c++,interface,C++,Interface,我遇到了一段代码,其中方法通过公共接口公开,而实现是私有的。我不确定预期的行为应该是什么。简化示例: #include <iostream> class Interface { public: virtual ~Interface() {} virtual void myIfMethod() = 0; }; class Derived : public Interface { private: void myIfMethod(){std::cout <

我遇到了一段代码,其中方法通过公共接口公开,而实现是私有的。我不确定预期的行为应该是什么。简化示例:

#include <iostream>

class Interface
{
public:
    virtual ~Interface() {}
    virtual void myIfMethod() = 0;
};

class Derived : public Interface
{
private:
    void myIfMethod(){std::cout << "private method invoked via public interface" << std::endl;}
};

int main()
{
    Interface* myObj = new Derived;
    myObj->myIfMethod();
    delete myObj;
    return 0;
}
#包括
类接口
{
公众:
虚拟~Interface(){}
虚空myIfMethod()=0;
};
派生类:公共接口
{
私人:
void myIfMethod(){std::coutC++标准草案

访问虚拟函数[class.Access.virt]

1虚拟函数的访问规则(第11条)由其声明确定,不受 以后重写它的函数的规则

2使用用于表示调用成员函数的对象的表达式类型(在上面的示例中为B*)在调用点检查访问。成员函数在定义它的类中的访问(在上面的示例中为D)通常是未知的

该函数是通过
接口类型的指针调用的,其中成员函数是公共的,因此允许访问。派生成员函数的访问未知且无效。就标准而言,该行为是正确的,定义良好


当然,定义重写函数private可能毫无意义,因为它无论如何都可以通过虚拟分派进行访问。

这不是错误的。这是毫无意义的,客户端代码总是可以转换为接口类型并进行调用。类不必使接口方法起作用,它可以抛出“未执行"例外。然后,您最好将其声明为私有以降低暴露风险。这方面也有很多问题。访问保护是一种编译时检查,您使用的是
接口
的接口,其中函数是公共的。关于最后一点,关于无意义,将其设置为使用接口。因此,如果你构造了具体类,你就不能调用该类上的方法,因为它们是私有的。@user3282085当然,但这引发了一个问题:阻止直接使用具体类的接口有什么意义吗?对我来说,这似乎是无用的悲观。你是对的;可能是不必要的就像有人可以浇铸混凝土一样。谢谢!:)