2017-01-11 2 views
1

Скажем, у меня есть базовый класс A и производный класс B, который добавляет некоторые дополнительные члены. Теперь я хотел бы иметь функцию setter для класса B, которая напрямую присоединяется к ее собственным членам, но назначает производные члены в пакетном режиме с использованием временного объекта A. Вот пример кода: «Могу ли я»Могу ли я получить доступ к «базовой части» моего объекта, как если бы это был собственный объект?

class A 
{ 
public: 
    int x; 
    int y; 
    A(int arg1, int arg2) 
     : x(arg1), y(arg2) {} 
}; 

class B : public A 
{ 
public: 
    int z; 
    B(int arg1, int arg2, int arg3) 
     : A(arg1, arg2), z(arg3) {} 
    void setB(int arg1, int arg2, int arg3) { 
     /*something here*/ = A(arg1, arg2); 
     this->z = arg3; 
    } 
}; 

// редактировать Я предполагаю, что не было ясно, что этот вопрос не является на самом деле а скорее «Как я могу?». Чтобы быть еще более конкретно: Что я могу поместить вместо /*something here*/ чтобы SETB() на самом деле работает так же, как:

void setB(int arg1, int arg2, int arg3) { 
    this->x = arg1; 
    this->y = arg2; 
    this->z = arg3; } 
+1

вы пытались его самостоятельно? я не вижу проблем с этим. также, подумайте о том, чего вы хотите достичь, это, похоже, не является хорошей идеей в целом. – JKreiser

+0

Вы * можете, * но будьте очень внимательны здесь. Если вы планируете ссылаться на объекты 'B' через' A', вы можете включить виртуальный деструктор, чтобы получить правильное поведение разрушения с полиморфными типами во всех контекстах, в которых вы могли бы их использовать, и взглянуть на [срез проблема.] (http://stackoverflow.com/questions/274626/what-is-object-slicing) – jaggedSpire

+0

@jaggedSpire В этом случае могут возникнуть проблемы с разрезом? Я не думаю, что это возможно, но, возможно, я ошибаюсь. – Brian

ответ

2

Могу ли я получить доступ к «базовой части» моего объекта, как если бы оно было предметом его собственной?

Да. Это полный экземпляр родительского класса, который находится внутри экземпляра производного класса.

Указатель или ссылка на производный класс преобразуются в указатель/ссылку на родителя.

Не указатель/ссылочное значение, то есть значение производного типа также преобразуется в родительский элемент, но создает копию родительского подобъекта, так же как преобразование любого другого типа значения в другое всегда создает копию.

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

Просто отбрасывать this или разыменованную ссылку на тип родительского класса:

(A&)*this = A(arg1, arg2); // or 
*(A*)this = A(arg1, arg2); 
1

В /*something here*/ = A(arg1, arg2);, вы можете бросить this его базового типа и называют это оператор неявное присваивание

(*((A*)this))= A(arg1, arg2); 
+1

Или '* static_cast (это)' – Brian