我编写了一个带有受保护继承性的虚函数
#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;拥有私人和受保护的遗产?
提前谢谢。答案 0 :(得分:3)
private
或protected
base表示基础无法访问。因此,当您编写需要从派生到无法访问的转换的表达式时,由于可访问性规则而禁止这样做,因为转换需要在调用站点进行这是世界的一部分。
在面向对象的术语中,private
或protected
base未定义 is-a 关系。它实际上是一个实现的关系,它的组合更简单。
答案 1 :(得分:1)
因为非公共继承没有定义“is-a”关系,编译器通常不会允许隐式上传
以下会有效,但这是一个糟糕的主意/设计
D*d = (D*)(new E);