Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++的代码> java/的味道,我试图把我的头脑围绕在C++的OOP模型上。我已经读过了:建议如何在C++中设计接口。上述代码是作者阐述的规则的直接应用(或其细微变化)。我的问题是,上面的代码是否会生成“thisx”后跟“thatyy”?我感到困惑的是,作者建议将virtual与private结合使用。我的推理是,如果一个函数是私有的,我们怎么能覆盖它呢? 在上面的代码中,Y可以用作赋值的右侧,因为我们从接口公开派生。当我们对它调用someFunction()时,由于我们没有在类Y中显式提供任何实现,它会使用类X中的实现吗?然后,如果它这样做了,它会查看doThat()并再次使用Ys实现它?_C++_Oop - Fatal编程技术网

抽象类与继承 来自C++的代码> java/的味道,我试图把我的头脑围绕在C++的OOP模型上。我已经读过了:建议如何在C++中设计接口。上述代码是作者阐述的规则的直接应用(或其细微变化)。我的问题是,上面的代码是否会生成“thisx”后跟“thatyy”?我感到困惑的是,作者建议将virtual与private结合使用。我的推理是,如果一个函数是私有的,我们怎么能覆盖它呢? 在上面的代码中,Y可以用作赋值的右侧,因为我们从接口公开派生。当我们对它调用someFunction()时,由于我们没有在类Y中显式提供任何实现,它会使用类X中的实现吗?然后,如果它这样做了,它会查看doThat()并再次使用Ys实现它?

抽象类与继承 来自C++的代码> java/的味道,我试图把我的头脑围绕在C++的OOP模型上。我已经读过了:建议如何在C++中设计接口。上述代码是作者阐述的规则的直接应用(或其细微变化)。我的问题是,上面的代码是否会生成“thisx”后跟“thatyy”?我感到困惑的是,作者建议将virtual与private结合使用。我的推理是,如果一个函数是私有的,我们怎么能覆盖它呢? 在上面的代码中,Y可以用作赋值的右侧,因为我们从接口公开派生。当我们对它调用someFunction()时,由于我们没有在类Y中显式提供任何实现,它会使用类X中的实现吗?然后,如果它这样做了,它会查看doThat()并再次使用Ys实现它?,c++,oop,C++,Oop,代码有一些问题。以下是一个工作示例: class MyInterface { public: virtual void someFunction()= 0; }; class X: public MyInterface { private: virtual void doThis() { printf("This X"); } virtual void doThat() { printf("That X"); } publ

代码有一些问题。以下是一个工作示例:

class MyInterface {
public:
    virtual void someFunction()= 0;
};

class X: public MyInterface {
private:
    virtual void doThis() {
        printf("This X");
    }
    virtual void doThat() {
        printf("That X");
    }
public:
    void someFunction() {
        doThis();
        doThat();
    }
};

class Y: public MyInterface, private X {
private:
    void doThat() {
        printf("That Y");
    }
};

MyInterface *iface= new Y();
Y->someFunction();
解释
  • 您需要使用
    classy:public X
    才能使用
    void X::someFunction()的实现

    遗憾的是C++中没有真实的接口,而且只使用纯虚拟类的解决方案。这种双亲解决方案有其自身的局限性(见下文)。因此,在接口定义中添加析构函数也是一个好主意

    使用
    classy:public MyInterface,private X时,需要提供
    MyInterface::someFunction()
    的自定义实现。您有两个父类和两个父类中的
    someFunction()
    X
    MyInterface
    )。即使只有一个函数实现,这也是必要的。因此,您需要指定将使用哪个父类“实现”。错误:

    “Y”:无法实例化抽象类

    删除接口时也会出现错误(尝试从
    X
    使用接口)。原因很简单,当
    X
    是私有的时,实现不是公共的,不能用作接口

    “类型转换”:存在从“Y*”到“MyInterface*”的转换,但无法访问

  • 您正在使用类作为
    Y->someFunction()中的类型

  • 我不知道,为什么可以重写私有虚拟函数。我现在大部分工作在C语言,C++的这个特性是我所不能得到的。您是对的,这应该是糟糕的代码,但它可以工作(至少在Visual Studio 2017中)

    我还想知道,为什么这不被视为错误/不正确的代码构造


  • 实际上,该代码不会编译,因为您正在用
    Y*
    初始化
    MyInterface
    class MyInterface
    {
    public:
        virtual ~MyInterface() { }
        virtual void someFunction() = 0;
    };
    
    class X : public MyInterface
    {
    private:
        virtual void doThis()
        {
            printf("This X\n");
        }
        virtual void doThat()
        {
            printf("That X\n");
        }
    
    public:
        void someFunction()
        {
            doThis();
            doThat();
        }
    };
    
    class Y : public X
    {
    private:
        void doThat()
        {
            printf("That Y\n");
        }
    };
    
    int main()
    {
        MyInterface *iface = new Y();
        iface->someFunction();
        delete iface;
    }