抽象类和继承

时间:2018-12-09 05:24:10

标签: 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");
    }
public:
    void someFunction() {
        doThis();
        doThat();
    }
};

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

MyInterface *iface= new Y();
Y->someFunction();

基于Java的OOP风格,我试图将头衔围绕C ++的OOP模型。我已阅读以下内容:http://www.gotw.ca/publications/mill18.htm,以获取有关如何在C ++中设计接口的建议。上面的代码是作者阐述的规则的直接应用(或其微小变化)。我的问题是,上面的代码是否会产生“ This X”和“ That Y”?我感到困惑的是,作者建议将virtualprivate结合使用。我的推断是,如果一个函数为private,我们该如何覆盖它? 在上面的代码中,由于我们是从接口公开派生的,因此可以将Y用作赋值的右侧。当我们在其上调用someFunction()时,由于我们没有在class Y内显式提供任何实现,它将使用class X中的实现吗?然后,只要有,它就会查看doThat()并再次使用Y的实现?

1 个答案:

答案 0 :(得分:0)

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

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;
}

说明

  1. 您需要使用class Y : public X才能使用void X::someFunction()的实现

    不幸的是,C ++中没有真正的接口,只有使用纯虚拟类的解决方法。有两个父母的解决方法有其自身的局限性(请参见下面的内容)。因此,在接口定义中添加析构函数也是一个好主意。

    使用class Y: public MyInterface, private X时,需要提供MyInterface::someFunction()的自定义实现。您有两个父类,并且两个父someFunction()X中都有MyInterface。即使只有一种功能实现,这也是必要的。因此,您需要指定将使用哪个父类“实现”。错误:

      

    'Y':无法实例化抽象类

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

      

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

  2. 您正在使用类作为Y->someFunction();

  3. 中的类型
  4. 我不知道为什么您可以覆盖私有虚拟函数。我现在主要在C#中工作,而C ++的这一“功能”是我无法理解的。没错,这应该是错误的代码,但是(至少在Visual Studio 2017中有效)

    我也想知道,为什么这不被认为是错误/不正确的代码构造。