1

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

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

但如果我使用它,它会变成无法访问的基地。

如果我将其更改为 public inherience ,它可以运行。

我想知道为什么我不能使用 D *d = new E; 具有私有和受保护的继承?

提前谢谢。

4

2 回答 2

3

privateprotected基地意味着基地是世界无法访问的。因此,当您编写一个需要从派生转换为不可访问基的表达式时,由于可访问性规则,这是被禁止的,因为转换需要在作为世界一部分的调用站点进行。

在面向对象的术语中,private或者protectedbase 没有定义is-a关系。它实际上是一种按关系实现的关系,更简单地说是组合。

于 2013-01-09T20:09:49.857 回答
1

因为非公共继承没有定义“is-a”关系,编译器一般不会允许隐式向上转换

以下方法可行,但这是一个坏主意/设计

D*d = (D*)(new E);
于 2013-01-09T20:11:07.940 回答