C ++ Исключить классы, унаследованные через базовый класс в производном классе - PullRequest
0 голосов
/ 03 ноября 2019

В C ++ возможно ли исключить класс, унаследованный в базовом классе, из подкласса?

Например, если у вас есть три таких класса:

class A
{
public:

    int x;
};

class B : public A
{
public:

    int y;
};

class C : public B
{
public:

    int z;
};

Isкласс B может содержать переменные x и y, тогда как класс C содержит только y и z?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Я думаю, что самым близким к тому, чего вы хотите достичь, является частное наследование.

struct A
{
    int x;
};

struct B : private A
{
    int y;
};

struct C : B
{
    int z;
};

int main()
{
    C c;
    c.x = 5; // error. you're not allowed to access members from A
    c.y = 3; // ok
    c.z = 4; // ok
}

Таким образом, данные A все еще будут там, но вы просто не сможете получить к ним доступ извне B.

Если вы хотите, чтобы данные вообще не существовали в C, тогда ответ - нет. Наследование - это буквально содержание ваших родителей в начале вашей структуры.

struct A
{
    int x;
};

struct B : A
{
    int y;
};

в памяти экземпляр B будет выглядеть так:

struct B
{
   int x;
   int y;
}
1 голос
/ 03 ноября 2019

Да, возможно встретить ваши ограничения наследования переменных. Используйте друг классы. С семантикой дружбы, предоставляемой ключевым словом friend в объявлении класса, вы можете создать производный класс, чтобы иметь доступ к закрытым членам его родительского класса. Ссылка содержит полное руководство по семантике дружбы.

Ваш код будет выглядеть так:

class A
{
private:

    int x;
    friend class B;
};

class B : public A
{
public:

    int y;
};

class C : public B
{
public:

    int z;
};

При этом class B имеет доступ к private x из class A,но только изнутри определение class B. Ваше ограничение наследования переменной выполнено, class B содержит (и может использовать) x и y, в то время как class C содержит y и z.

Другим способом может быть частное наследованиевот так:

class A
{
private:

    int x;
};

class B : private A
{
public:

    int y;
};

class C : public B
{
public:

    int z;
};

Но это намного строже, чем friend подход. Выберите тот, который соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...