Единственное различие между классом и структурой в C ++ состоит в том, что Спецификаторы доступа .
Для классов спецификатор доступа по умолчанию является приватным.
Для структур спецификатор доступа является публичным по умолчанию.
Это означает, что если у вас есть класс, производный от другого класса / структуры, по умолчанию это будет частное наследование &
Если у вас есть структура, производная от другого класса / структуры, по умолчанию это будет публичное наследование .
Одной из проблем является то, что, поскольку для структуры по умолчанию определитель доступа является открытым, они могут предоставлять члены, которые, возможно, не должны подвергаться производным классам.В этом смысле вся инкапсуляция имеет совершенно новое измерение.Конечно, вы. Если вы можете изменить спецификаторы доступа внутри структуры, которую вы намереваетесь использовать в качестве базы, тогда можно избежать проблемы, но это может быть невозможно, поскольку это может повлиять на то, как структура используется из других частейпрограмма.
РЕДАКТИРОВАТЬ:
Благодаря комментариям у меня есть четкое представление о том, какие ошибки вы имеете в виду, ошибки не являются конкретно, потому что вы производные от структурыно потому что вы неправильно понимаете правила спецификаторов наследования и доступа.
Вот пример программы для демонстрации:
#include<iostream>
using namespace std;
struct FirstStruct
{
private:
int a;
public:
int b;
FirstStruct():a(10),b(20),c(30)
{
}
protected:
int c;
};
class MyClass:protected FirstStruct
{
public:
int i;
MyClass():i(40),j(50),k(60)
{
}
void doSomething()
{
a = 100; //private in Base is not accessible in Derived
b = 100; //Accessible
c = 100; //Accessible
i = 100; //Accessible
b = 100; //Accessible
c = 100; //Accessible
}
private:
int j;
protected:
int k;
};
int main()
{
MyClass obj;
obj.i = 100; //Accessible
obj.j = 100; //Error Cannot be Accessed, j is private member
obj.k = 100; //Error Cannot be Accessed, k is protected member
obj.a = 100; //Error Cannot be Accessed, a is private member in Base Class
obj.b = 100; //Error Cannot be Accessed;
//b is protected member of MyClass, because of protected Inheritance
obj.c = 100; //Error Cannot be Accessed;
//same reason as b
obj.doSomething();
return 0;
}
Вы можете проверить запуск того же здесь в Ideone.
Вы будетеОбратите внимание, даже если вы измените тип базы с struct FirstStruct
на class FirstStruct
здесь вы получите те же ошибки (не более и не менее).
Suggestвам нужно взглянуть на этот ответ здесь , чтобы прояснить ваше понимание правил наследования и доступа.