gpt4 book ai didi

c++ - 访问继承函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:40 25 4
gpt4 key购买 nike

在多重继承中,所有基类都包含具有不同功能的相同函数名,我们可以使用“::”范围解析运算符从特定基类访问 protected 函数。但是,我尝试了其他方法。我在子类中创建了基类的对象。并尝试通过该特定类的对象调用该函数。但是我收到以下编译器错误: “‘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);
}

最佳答案

如果您想让基类的代码保持独立功能并仍然受到保护,解决问题的最简单方法是稍微更改 protected 函数的名称并添加调用 protected 成员的公共(public)函数:例如,请参阅这些类声明:

class A {
public:
void func( int& a ) {
func_impl( a );
}
protected:
void func_impl( int& a ) {
a = a * 2;
}
};

class B {
public:
void func( int& b ) {
func_impl( b );
}
protected:
void func_impl( int& b ) {
b = b * 3;
}
};

class C {
public:
void func( int& c ) {
func_impl( c );
}
protected:
void func_impl( int& c ) {
c = c * 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 val ) {
a = val;
a_val.func( a );
b_val.func( a );
c_val.func( a );
}

void check( int );
};

void D::check( int val ) {
update_val( val );
std::cout << "Value = " << a << std::endl;
}

这提供了一个很好的公共(public)接口(interface)来调用 protected 成员函数。这也解决了访问 protected members 的问题。当我运行您的程序并输入值 5 时,它返回结果 150 并按预期工作。


此代码段应向您展示继承的工作原理以及何时可以和不可以访问 protected 成员:

class DerivedA : public Base {
public:
Base b;

void call_message() {
b.message(); // Protected Member of Base class can not be accessed
}
};

class DerivedB : public Base {
public:
void call_message() {
message(); // This works without problem!
}
};

正如我在上面所做的那样,解决此问题的一种方法是向 protected 实现添加一个公共(public)接口(interface)调用程序。

class Base {
public:
void message() {
message_impl();
}
protected:
void message_impl() {
std::cout << "This is a protected member of Base\n";
}
};

现在你可以这样做了:

class DerivedA {
public:
Base b;

void call_message() {
b.message(); // Accessible through public interface.
}
};

关于c++ - 访问继承函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52790462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com