在派生类中具有相同签名但继承为受保护的函数

Functions with same Signature in derived class but inherited as Protected

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

基类函数和派生类函数具有相同的签名,但继承为受保护的。在main中,我已经将派生类对象分配给基类指针,并且我正在尝试访问该函数。它会导致错误。是因为受保护吗?

class base{
public:
void test(){
cout<<"test in basen";
}
};
class derived:protected base{
public:
void test(){
cout<<"test in derivedn";
}
};

int main(){
base *ptr;
derived obj;
ptr=&obj;
ptr->test();
return 0;
}

错误:

In function 'int main()':
error: 'base' is an inaccessible base of 'derived'
ptr=&obj;
^~~

编辑问题中的代码发生了变化,所以我改变了整个答案:

私有和受保护的继承都允许覆盖私有/受保护基类中的虚函数,两者都不声明派生是其基类的一种。所以ptr=&obj;不起作用,因为它们不是同一类型。

受保护的继承允许派生类的派生类 了解继承关系。因此,您的孙子是 有效地暴露您的实施细节。这两者兼而有之 好处(它允许受保护派生类的派生类 利用与受保护基类的关系(和成本( 受保护的派生类无法更改关系,否则 可能会破坏进一步的派生类(。

由于你使用的是对外界的保护继承derived不是从base派生的,只有derived及其子类知道它是从base派生的。

因此:

base *ptr;
derived obj;
ptr=&obj;

是否将derived*分配给完全不相关的类型base*。如果您希望derived可转换为base则需要使用public继承,protected继承故意向外界隐藏基类。