我们可以在派生 class 中访问基 class 的受保护成员函数吗?
Can we access protected member functions of base class in derived class?
根据我的研究,Derived class 可以访问基 class 的受保护成员。在派生 class 中,基 class 的受保护成员在派生 class 中作为 public 工作。 但是当我实现这个时,我得到一个错误
我的代码:
#include <iostream>
using namespace std;
class Shape {
protected :
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
错误:
In function ‘int main()’:
32:19: error: ‘void Shape::setWidth(int)’ is protected within this context
Rect.setWidth(5);
^
:9:12: note: declared protected here
void setWidth(int w) {
^~~~~~~~
:33:20: error: ‘void Shape::setHeight(int)’ is protected within this context
Rect.setHeight(7);
^
:12:12: note: declared protected here
void setHeight(int h) {
^~~~~~~~~
请有人帮助我理解访问修饰符
In derived class, protected member of base class works as public in derived class.
事实并非如此。要么是您的来源有误,要么是此引述被断章取义。
publicly-inherited 基 class 的受保护成员默认情况下在派生 class 中仍然受到保护,也就是说,派生 class 成员函数可以访问它们,但无法从 class.
外部访问它们
您可以确认并了解更多详细信息here,特别是在“受保护的成员访问”段落中。
是的,派生的 class 可以访问受保护的成员,无论这些成员是数据还是函数。但是在您的代码中,是 main
试图访问 setWidth
和 setHeight
,而不是 Rectangle
。这是无效的,就像使用 main
中的 width
和 height
一样。
派生 class 使用受保护成员函数的示例:
class Rectangle: public Shape {
public:
int getArea() const {
return (width * height);
}
void setDimensions(int w, int h) {
setWidth(w);
setHeight(h);
}
};
或者如果你真的想让 Rectangle
让其他人使用这些功能,你可以使用 Rectangle
必须使他们成为 Rectangle
的 public
成员的访问权限的 protected
:
class Rectangle: public Shape {
public:
using Shape::setWidth;
using Shape::setHeight;
int getArea() const {
return (width * height);
}
};
根据我的研究,Derived class 可以访问基 class 的受保护成员。在派生 class 中,基 class 的受保护成员在派生 class 中作为 public 工作。 但是当我实现这个时,我得到一个错误
我的代码:
#include <iostream>
using namespace std;
class Shape {
protected :
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
错误:
In function ‘int main()’:
32:19: error: ‘void Shape::setWidth(int)’ is protected within this context
Rect.setWidth(5);
^
:9:12: note: declared protected here
void setWidth(int w) {
^~~~~~~~
:33:20: error: ‘void Shape::setHeight(int)’ is protected within this context
Rect.setHeight(7);
^
:12:12: note: declared protected here
void setHeight(int h) {
^~~~~~~~~
请有人帮助我理解访问修饰符
In derived class, protected member of base class works as public in derived class.
事实并非如此。要么是您的来源有误,要么是此引述被断章取义。
publicly-inherited 基 class 的受保护成员默认情况下在派生 class 中仍然受到保护,也就是说,派生 class 成员函数可以访问它们,但无法从 class.
外部访问它们您可以确认并了解更多详细信息here,特别是在“受保护的成员访问”段落中。
是的,派生的 class 可以访问受保护的成员,无论这些成员是数据还是函数。但是在您的代码中,是 main
试图访问 setWidth
和 setHeight
,而不是 Rectangle
。这是无效的,就像使用 main
中的 width
和 height
一样。
派生 class 使用受保护成员函数的示例:
class Rectangle: public Shape {
public:
int getArea() const {
return (width * height);
}
void setDimensions(int w, int h) {
setWidth(w);
setHeight(h);
}
};
或者如果你真的想让 Rectangle
让其他人使用这些功能,你可以使用 Rectangle
必须使他们成为 Rectangle
的 public
成员的访问权限的 protected
:
class Rectangle: public Shape {
public:
using Shape::setWidth;
using Shape::setHeight;
int getArea() const {
return (width * height);
}
};