Допустим, у меня есть 2 класса: foo и foo2, которые написаны как таковые:
foo.h:
#ifndef __InheritanceTest__foo__
#define __InheritanceTest__foo__
#include <stdio.h>
class foo
{
public:
foo();
int getSize();
protected:
int size;
};
#endif
foo.cpp:
#include "foo.h"
foo::foo()
{
size = 23;
}
int foo::getSize()
{
return size;
}
foo2.h:
#ifndef __InheritanceTest__foo2__
#define __InheritanceTest__foo2__
#include <stdio.h>
#include "foo.h"
class foo2: foo
{
public:
foo2();
};
#endif
foo2.cpp:
#include "foo2.h"
foo2::foo2()
{
size = size *2;
}
это мое главное:
#include <iostream>
#include "foo.h"
#include "foo2.h"
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
foo2 f2;
int i = f2.getSize();
std::cout << i << "\n";
return 0;
}
Я получаю две ошибки:
'getSize' является частным членом foo
а также
не может отбросить foo2 в его собственный базовый класс foo.
Наследование через классы по умолчанию является закрытым. Это означает, что унаследованные члены данных и функции-члены являются частными в производном классе и могут быть доступны только через самих себя или друзей класса.
Используйте ключевое слово public
для указания общего наследования:
class foo2 : public foo
{ ... }
Обратите внимание, что это не похоже на struct
которая имеет публичное наследование и открытый доступ для своих членов данных и функций-членов.
Ваше объявление foo2 в foo2.h вызывает эту проблему:
...
class foo2: foo
{
...
В целом:
В C++ для каждого унаследованного класса существуют спецификаторы доступа к наследованию, так же как в каждом классе есть частные (специальные), защищенные, общедоступные. Эти спецификаторы решают, что является самым открытым уровнем, член (функция) базового класса будет доступен в производном классе.
Обратите внимание, что "most open" означает более строгий спецификатор доступа наследования и спецификатор доступа к члену (функции):
public inheritance + public member (function) = public member (function)
public inheritance + protected member (function) = protected member (function)
public inheritance + private member (function) = private member (function)
protected inheritance + public member (function) = protected member (function)
защищенное наследование + защищенный элемент (функция) = защищенный член (функция)
protected inheritance + private member (function) = private member (function)
private inheritance + public member (function) = частный член (функция) (ваш случай)
private inheritance + protected member (function) = private member (function)
private inheritance + private member (function) = private member (function)
В твоем случае:
Спецификатор доступа по умолчанию для наследования является закрытым, поэтому foo наследуется в частном порядке здесь (что означает, что каждая функция и член, унаследованный от foo, будут закрыты в foo2). Из-за этого foo.getsize() становится частным с точки зрения foo2, и вы не можете его назвать.
Решение. Измените строку выше:
class foo2 : public foo
Подробнее о теме: SO Вопрос: C++ спецификаторы доступа
PS: Когда я использую термин member (function), я имею в виду как элементы данных, так и функции-члены.