Запретить поля в дочернем классе C ++ - PullRequest
1 голос
/ 28 июля 2010

У нас с другом недавно возникла следующая проблема. Был базовый класс:

class A {
public:
    A() : foo(10) {}
    virtual int getFoo() const { return foo; }

protected:
    int foo;
};

Друг реализовал класс, производный от предыдущего.

class B : public A {
public:
    void process() { foo = 666; }
protected:
    //int foo;
};

К сожалению, он также добавил поле foo в классе потомков (закомментированная строка). Итак, следующий код.

#include <iostream>

int main()
{
    A* aaa= NULL;
    if (1) {
        B* bbb = new B;
        bbb->process();
        aaa = bbb;
    }

    std::cout << aaa->getFoo() << std::endl;

    return 0;
}

напечатано 10 .

Это не проблема, так как это будет полностью переработано, и таких вещей не произойдет в будущем.

Мне было просто интересно, знаете ли вы какие-либо (переносимые) трюки или языковые шаблоны ( помимо очевидных получателей / установщиков; кстати, они были там на самом деле, с foo , являющимися приватными) запретит объявление переменной с тем же именем в классе потомков (например, из-за ошибки времени компиляции).

ТИА!

Ответы [ 4 ]

6 голосов
/ 28 июля 2010

Нет - вы не должны заботиться о реализации базового класса, поэтому вы не должны быть ограничены в именовании членов в вашем производном классе.А защищенные данные - плохая идея.

3 голосов
/ 28 июля 2010

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

PS: ваш тестовый пример не должен быть таким сложным:

B b;
b.process();
b.getfoo();

также вернет 10

1 голос
/ 28 июля 2010

C ++ не имеет много функций, чтобы защитить вас от ошибок.На самом деле нет никакого способа узнать, что вы хотели, и поэтому не можете сказать, что на самом деле является ошибкой.

0 голосов
/ 28 июля 2010

Не на самом языке, но некоторые компиляторы могут быть настроены для сообщения определенных типов предупреждений как ошибокОбратитесь к документации вашего компилятора для справки.

...