Это законно / безопасно C ++?(перевод в класс наследования того же размера) - PullRequest
3 голосов
/ 03 февраля 2012

Извините за неописуемый заголовок, но у меня сейчас сложный путь со словами. Я просто прыгну в него:

class A
{
public:

protected:
    int doSomething();
};

class B : public A
{
public:
    int doSomething() { return A::doSomething(); }
};

...

A *a = new A;
B *b = static_cast<B*>(a);

cout << b->doSomething();

В частности, B наследует A и не добавляет никаких элементов данных или виртуальных функций и не переопределяет никакие виртуальные функции. Это означает, что экземпляр B должен быть эквивалентен в памяти экземпляру A, я полагаю.

В принципе, это безопасно? Я уверен, что это не законно, но переносимо ли? Есть ли потенциальные последствия полагаться на что-то подобное? (Кроме нормального ядаяда.)

Очевидно, что это плохая практика, но я вижу это так же, как вижу, как отбрасываю const - это может быть лучше, чем альтернатива (если она есть). Однако, если у вас есть неочевидные причины, это плохо, мне определенно интересно.

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

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

class A
{
public:

protected:
    int doSomething();
};

template <class T> 
class B : public T
{
 ... 
}

Затем в своем клиентском коде вы можете создать объект, который предлагает наборы функций. Благодаря информативности шаблонов vardic вы можете создавать объекты путем сжатия с точки зрения потребителя.

B<A> Ob; 

Также взгляните на шаблон CRTP .

1 голос
/ 03 февраля 2012

Я уверен, что это не законно, но переносимо ли это?

Единственный способ быть портативным - это быть легальным. Если под «портативным» вы не подразумеваете перенос между небольшим набором похожих систем.

1 голос
/ 03 февраля 2012

Даже если явно ничего плохого не произойдет, вопрос в том, зачем вас заставлять делать что-то подобное?

Если вам нужна только оболочка, гораздо более понятный дизайн - сделать A членом B и позволить B перенаправить вызовы A.

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