【发布时间】:2019-03-18 07:56:04
【问题描述】:
在多重继承中,所有基类都包含具有不同功能的相同函数名,我们可以使用“::”范围解析运算符从特定基类访问受保护的函数。 但是,我尝试了其他方法。我在子类中创建了基类的对象。并尝试使用该特定类的对象调用该函数。 但我收到以下编译器错误: “‘void A::func(int&)’在此上下文中受到保护。” 请让我知道我哪里出错了。
#include <iostream>
using namespace std;
class A
{
protected:
void func(int & a)
{
a = a * 2;
}
};
class B
{
protected:
void func(int & a)
{
a = a * 3;
}
};
class C
{
protected:
void func(int & a)
{
a = a * 5;
}
};
class D : public A,public B,public C {
public:
int a;
A a_val;
B b_val;
C c_val;
void update_val(int new_val)
{
a = new_val;
a_val.func(a);
b_val.func(a);
c_val.func(a);
}
void check(int);
};
void D::check(int new_val)
{
update_val(new_val);
cout << "Value = " << a << endl;
};
int main()
{
D d;
int new_val;
cin >> new_val;
d.check(new_val);
}
【问题讨论】:
-
其实这是一种方法,stackoverflow.com/questions/4672438/…可能更合适。
-
如果你不需要它们,你从 A、B 和 C 继承了什么。从类派生并具有相同类型的成员通常没有多大意义。如果您使用与类本身不同类型的对象,则需要公共访问或友谊。那么,如果您想公开访问
func,为什么要对其进行保护呢? -
A、B 和 C 类是您自己的代码还是您不想修改的一些外部库,这样您就不必在每次更新库或编译库时都修改库由供应商(无来源),如果更改不兼容,您可能希望避免未定义行为的风险。
-
设计似乎完全错误。如果您从 A、B 和 C 继承,然后从 A、B 和 C 获得成员变量只是为了访问它们的受保护方法,请返回板并重新设计您的代码。这不好。非常糟糕。
标签: c++ c++11 inheritance protected access-specifier