公共虚方法被重写为继承类中的受保护

时间:2014-01-08 12:15:03

标签: c++ inheritance polymorphism

我在类C中定义了受保护的抽象虚方法myMethod()。类D继承自C并定义myMethod()。现在E类也继承自C并定义myMethod()。所以我有这样的事情:

这看起来像这样

class C
{
protected:
    virtual void myMethod() = 0;
}

class D : public class C
{
protected:
    void myMethod() {/*Do something*/};

    void anotherMethod();
}

class E : public class C
{
protected:
    void myMethod() {/*Do something else*/};
}

现在如果在D::anotherMethod()中我有一个指向E类对象的指针,那么我就不能调用E::myMethod()。这里没有错:D和E有不同的层次结构,因此我不能从D中调用E::myMethod(),即下面的代码不能编译预期:

void D::anotherMethod()
{
    E* myE = new E();

    myE->myMethod();
}

现在,如果我更改C的声明并使E::myMethod()公开(同时将重写的方法保留在D和E protected中),例如在下面的代码中,它将编译:

class C
{
public:
    virtual void myMethod() = 0;
}

class D : public class C
{
protected:
    void myMethod() {/*Do something*/};

    void anotherMethod();
}

class E : public class C
{
protected:
    void myMethod() {/*Do something else*/};
}

我只在C内部将public更改为protected,而不是在继承的D和E类中。

有谁知道它编译的原因以及它背后的逻辑是什么?

谢谢!

安托。

1 个答案:

答案 0 :(得分:2)

我们可以使用C接口,因为它是公开的: E界面受到保护,D无法从E访问,但可以从基类C访问

如下:

class C
{
public:
    virtual void myMethod() = 0;
};

class E : public C
{
protected:
    void myMethod() {/*Do something else*/};
};


class D : public C
{
protected:
    void myMethod() {/*Do something*/};

    void anotherMethod(){
        //C* myE = new E(); // does compile
        E* myE = new E(); // doesn't compile

        myE->myMethod();
    }
};