Очевидно, что Derived не может получить доступ к закрытым членам Foo, по-видимому, потому что Derived :: m_foo является производным членом, поэтому создание Derived завершится неудачей.
Извините, это не очевидноенедоразумение друга.
Класс друга может получить доступ к любому атрибуту.
У вас есть несвязанная ошибка кодирования ... комментарии показывают, что вы пропустили инициализацию (Base :: m_foo)в базе.Исправьте это, добавьте несколько элементов данных в Foo, а затем запустите демонстрацию:
#include <iostream>
using std::cout, std::endl;
class Foo
{
public:
Foo(int x): m_x(x){}
~Foo(){}
int m_z; // add public
protected:
int m_y; // add protected
private: // change to private
friend class Derived;
int m_x;
};
class Base
{
public:
Base() : m_foo(0) // add m_foo Initialization (with 0)
{}
virtual ~Base(){}
protected:
Foo m_foo;
};
class Derived : public Base
{
public:
Derived(Foo foo)
{
foo.m_y = 11;
foo.m_z = 22;
std::cout << foo.m_x << " "
<< foo.m_y << " "
<< foo.m_z << std::endl; //friend class can access
}
};
class T914_t // ctor and dtor compiler provided defaults
{
public:
int operator()(int argc, char* argv[]) { return exec(argc, argv); }
private: // methods
int exec(int , char** )
{
Foo f(99);
Derived d(f);
return 0;
}
}; // class T914_t
int main(int argc, char* argv[]) { return T914_t()(argc, argv); } // call functor
Типичный вывод из класса Производный ctor с доступом к личным, защищенным и общедоступным атрибутам данных:
99 11 22 * 1018 *