带虚函数的受保护继承

protected inherientence with virtual function

本文关键字:受保护 继承 函数      更新时间:2023-10-16

我写了一个保护继承的虚函数

#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;私有和受保护的继承?

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

在面向对象术语中,privateprotected基没有定义is-a关系。它实际上是根据关系实现的,简单来说就是组合。

由于非公共继承不定义"is-a"关系,编译器通常不允许隐式上转换

下面的方法可以工作,但是这是一个坏主意/design

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