Следующий код не будет компилироваться, потому что, по-видимому, так работают защищенные члены. (Есть вопросы, ответы на которые почему-то на SO, например, here).Что может пойти не так, если я использую бросок для доступа к защищенному члену?
class Parent {
protected:
int value;
};
class Child : public Parent {
public:
void set_value_of(Parent* x, int value) {
x->value = value;
}
};
int main() {
}
Например, GCC сообщает
main.cpp: In member function 'void Child::set_value_of(Parent*, int)':
main.cpp:11:16: error: 'int Parent::value' is protected within this context
x->value = value;
^~~~~
main.cpp:5:13: note: declared protected here
int value;
^~~~~
Что может пойти не так, если вы накладываете x
к Child
? Это случай никогда не делайте этого или вы можете, если знаете, что делаете?
void set_value_of(Parent* x, int value) {
static_cast<Child*>(x)->value = value;
}
Редактировать К сожалению, все предложения для получения вокруг этого злоупотребления до сих пор не помогает мне в решении моей проблемы проектирования, поэтому я стараюсь быть менее общими и показать мою actualy реального мира дело.
Основная цель состоит в том, чтобы не полагаться на friend
декларации, как Node
класса не должен быть изменен (то есть. Не друг декларация не должна должна быть добавлена), для реализации другого подкласса как Group
.
class Node {
protected:
Node* _parent;
};
class Group : public Node {
protected:
std::vector<Node*> _nodes;
public:
void insert(Node* node) {
if (node->_parent) {
throw std::runtime_error("node already has a parent");
}
_nodes.push_back(node);
node->_parent = this;
}
};
Это может быть решена путем добавления friend class Group
в Node
классе, но я искал способ вокруг него.
Что вы пытаетесь сделать? Почему у одного класса есть метод, который работает в другом классе? –
Я связал тот самый вопрос, это должно быть дубликат .. Я понял, что это не тот же вопрос, duh –
То, что вы делаете, действительно, если вы делаете 'dynamic_cast' вместо этого, и сравниваете полученный указатель с' nullptr' первый. 'dynamic_cast' гарантирует, что он вернет только действительный указатель, если литой объект действительно является указателем этого типа. – Xirema