用虚函数保护遗传

时间:2013-01-09 20:07:46

标签: c++

我编写了一个带有受保护继承性的虚函数

#include<iostream>
using namespace std;
class D{
private:
    int a;
protected:
    int b;
public:
    D(){a=b=c=0;}
    virtual void f(){
    a=2;
    cout <<"D::f"<<a<<endl;
    }
    void g(){cout<<"D::g"<<a<<endl;}
    int c;
};
class E:protected D{
    private:
        int a,b,c;
    public:
        E(){a=b=c;}
        void f(){
            a=3;
            cout<<"E::f"<<a<<endl;
        }
        void g(){cout<<"E::g"<<a<<endl;}
};
int main(){
    D *d = new E;
    d->f();
    d->g();
    return 0;
}

但是如果我使用它,那么它就会变得难以接近。

如果我将其更改为公共继承,它可以运行。

我想知道为什么我不能使用D * d = new E;拥有私人和受保护的遗产?

提前谢谢。

2 个答案:

答案 0 :(得分:3)

privateprotected base表示基础无法访问。因此,当您编写需要从派生到无法访问的转换的表达式时,由于可访问性规则而禁止这样做,因为转换需要在调用站点进行这是世界的一部分。

在面向对象的术语中,privateprotected base未定义 is-a 关系。它实际上是一个实现的关系,它的组合更简单。

答案 1 :(得分:1)

因为非公共继承没有定义“is-a”关系,编译器通常不会允许隐式上传

以下会有效,但这是一个糟糕的主意/设计

D*d = (D*)(new E);