首页 > 解决方案 > 访问继承的函数

问题描述

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

标签: c++c++11inheritanceprotectedaccess-specifier

解决方案


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

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;
}

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


这个片段应该向您展示继承是如何工作的,以及您何时可以访问受保护的成员和不能访问受保护的成员:

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!
    }
};

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

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.
    }
};

推荐阅读