【发布时间】:2023-03-18 04:15:01
【问题描述】:
来自http://www.parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.5
在类的受保护部分中声明的成员(数据成员或成员函数)只能由该类的成员函数和朋友以及派生类的成员函数和朋友访问
那么,在派生类中访问受保护函数fun的方法是什么?
#include <iostream>
using namespace std;
class X
{
private:
int var;
protected:
void fun ()
{
var = 10;
cout << "\nFrom X" << var;
}
};
class Y : public X
{
private:
int var;
public:
void fun ()
{
var = 20;
cout << "\nFrom Y" << var;
}
void call ()
{
fun ();
X objX;
objX.fun ();
}
};
这会导致:
anisha@linux-dopx:~/> g++ type.cpp
type.cpp: In member function ‘void Y::call()’:
type.cpp:9:8: error: ‘void X::fun()’ is protected
type.cpp:32:14: error: within this context
我看到了这个:Accessing protected members in a derived class
给定:
您只能在您的类型的实例中访问受保护的成员(或 派生自您的类型)。您不能访问受保护的成员 父类或表亲类型的实例。
在您的情况下,派生类只能访问 a 的 b 成员 派生实例,而不是不同的 Base 实例。
将构造函数更改为采用 Derived 实例也将解决 问题。
如何在不更改构造函数声明的情况下实现这一点?
【问题讨论】:
标签: c++ inheritance