теневое копирование — переопределить элемент данных в производном классе C ++

У меня есть сомнения, с переопределением C ++. Я назначаю память в классе Derived, поэтому мне нужно, чтобы эта память была зарезервирована в базовом классе. Итак, мне нужно учесть, что attibute в базовом классе — это то же самое, что атрибут в классе Derived, и я не знаю, возможно ли это в C ++.

class Base {
protected:
float * a;
Base() {}
public:
virtual void reset() {
a = 0;
}
virtual void exec() {
printf("Memory a: %x\n",a);
}
};

class Derivada: virtual public Base {
protected:
float * a;
Derivada() {}
virtual void reset() {
a = new float[256];
}
};

int main() {
Derivada *hija= new Derivada();
hija->reset();
hija->exec();
delete hija;
}

я действительно нужно сделать перегрузку, потому что это пример моей настоящей проблемы. У меня есть один и тот же тест (Производный основной, код), для двух разных классов Base, по одному в каждой ветке, из моих двух ветвей, CVS.

В одном из этого класса Base у меня есть эти атрибуты, а в другом классе Base у меня нет этих атрибутов, поэтому я должен поместить его в класс Derived для компиляции.

Я не хотел бы делать два разных тестовых кода, поэтому мне нужно переопределить атрибут

2

Решение

Вы можете сделать что-то вроде этого (но требует C ++ 11):

#include <type_traits>

// A way to check for 'attr' data member presence/absence using SFINAE
template<class T> constexpr auto missing_attr(T) -> decltype(T::attr, bool())
{
return false;
}
constexpr bool missing_attr(...) { return true; }

struct Base { /* There might be (or not) a float data member 'attr' */ };

template<bool> struct Inject;
template<> struct Inject<true> { float attr = 0.0; };
template<> struct Inject<false> {};

struct Derived : public Base, protected Inject<missing_attr(Base())>
{
void do_something_with_attr()
{
// Derived has only one 'float attr' (it can be from Base or from Inject).
a *= a;
}
};

Существуют и другие способы обнаружения существования элемента данных, например, член детектор идиома (C ++ 03 совместимый).

2

Другие решения

Не объявляйте заново член в производном классе. Слово «защищенный» обеспечивает видимость.

Если вы повторно объявите участника, у вас будет новый участник. Это называется слежка. Смотрите, например

3

По вопросам рекламы [email protected]