带虚函数的受保护继承
protected inherientence with virtual function
我写了一个保护继承的虚函数
#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;私有和受保护的继承?
private
或protected
基地表示该基地无法与外界接触。因此,当您编写一个表达式,需要从派生到不可访问的基的转换时,由于可访问性规则,这是被禁止的,因为转换需要在调用站点进行,这是世界的一部分。
在面向对象术语中,private
或protected
基没有定义is-a关系。它实际上是根据关系实现的,简单来说就是组合。
由于非公共继承不定义"is-a"关系,编译器通常不允许隐式上转换
下面的方法可以工作,但是这是一个坏主意/design
D*d = (D*)(new E);
相关文章:
- 继承和友元函数,从基类访问受保护的成员
- 为什么继承的受保护构造函数不能公开?
- 在使用受保护和继承时无法访问在类中声明的私有成员
- 继承期间受保护成员的皮条
- 在 lambda 函数 g++-4.8 中调用继承的受保护子类型
- 在派生类中具有相同签名但继承为受保护的函数
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 使从一个基类派生的类能够使用继承的受保护成员
- 为什么继承的受保护操作员=()有公共访问权限
- C :可以从类及其受保护的成员类型继承可以继承吗?
- C++对已继承的受保护类成员的未定义引用
- 如何访问多个继承类中的受保护成员
- 用受保护的继承指向基类方法
- C 继承访问受保护的数据成员
- 受保护的方法在 c++ 中继承时可以成为私有方法
- 继承公共/受保护/私有构造函数
- 虚拟继承和受保护的成员访问
- 在 std:: 容器中使用受保护继承的原因
- 具有多态性的多重受保护继承
- 带虚函数的受保护继承