我怎样才能在基类中使用派生类函数?

时间:2017-01-16 00:00:15

标签: c++ inheritance friend

我有以下代码:

#include <iostream>

class A {
    private:
        int a;
    public:
        void setA(int a_);
    friend int B::getA();
};

class B : public A {
    public:
        int getA();
};

void A::setA(int a_) {
    a = a_;
}

int B::getA() {
    return a;
}

int main() {
    B myB;
    myB.setA(9);

    std::cout << myB.getA()<< std::endl;
    return 0;
}

使用g ++编译产生:

friend.cpp:10:16: error: use of undeclared identifier 'B'
    friend int B::getA();

我的想法是,当编译器通过A类定义时,它还不知道B类。因此,我可以转发声明B来处理这个问题:

#include <iostream>

class B;

class A {
...

这不太有效:

friend.cpp:10:16: error: incomplete type 'B' named in nested name specifier
    friend int B::getA();

看起来编译器无法解析函数。

如何将派生类函数作为基类中的朋友?

1 个答案:

答案 0 :(得分:1)

您的代码似乎违反了数据封装的基本概念。要解决它,要么像Arici建议的那样使A :: a受保护,要么在A类中定义一个getter。

class A {
private:
   int a;
public:
   void setA(int a_);
   virtual int getA();
};

class B : public A {
public:
   int getA();
};

void A::setA(int a_) {
   a = a_;
}
int A::getA() {
   return a;
}

int B::getA() {
   return A::getA();
}