C ++ не позволяет мне вызывать публичный метод из базового класса

0

Допустим, у меня есть 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.

Теги:
inheritance

2 ответа

2
Лучший ответ

Наследование через классы по умолчанию является закрытым. Это означает, что унаследованные члены данных и функции-члены являются частными в производном классе и могут быть доступны только через самих себя или друзей класса.

Используйте ключевое слово public для указания общего наследования:

class foo2 : public foo
{ ... }

Обратите внимание, что это не похоже на struct которая имеет публичное наследование и открытый доступ для своих членов данных и функций-членов.

  • 0
    Это сработало, но я мог поклясться, что в какой-то момент я добавил public, но не смог скомпилировать и удалил его. Я, должно быть, воображаю вещи.
1

Ваше объявление 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), я имею в виду как элементы данных, так и функции-члены.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню