Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2011, 18:53   #41
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
Con1    0012FF4B
Con2    0012FF4C
Con12   0012FF4B
ConS    0012FF4B
ORIG:   0012FF4B
*****************
Con1    0012FE60
Con2    0012FE61
CCon12  0012FE60
COPY:   0012FE60
Des12   0012FE60
Des2    0012FE61
Des1    0012FE60
*****************
DesS    0012FF4B
Des12   0012FF4B
Des2    0012FF4C
Des1    0012FF4B
Для продолжения нажмите любую клавишу . . .
вот весь вывод.
MSVC++2010Express
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.02.2011, 19:02   #42
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

И тут в второго класса другой адрес. Странно.
Но с количеством-то всё в порядке. Интересно, что покажет компилятор у Janym.

upd: ничего странного:
Цитата:
msvs все правильно делает, просто видимо добавляет в класс какие-то скрытые поля, которые делают его размер ненулевым. Если в каждый класс добавить хотя бы одно поле, результат в gcc будет таким же.
Вот проверка:
Код:
#include <iostream>
using namespace std;

class MyBase1
{
public:
    int x1;
    MyBase1() {
        cout << "Con1\t" << this << endl;
    }
    MyBase1(const MyBase1 &other) {
        cout << "CCon1\t" << this << endl;
    }
    ~MyBase1() {
        cout << "Des1\t" << this << endl;
    }
    
};

class MyBase2
{
public:
    int x2;
    MyBase2() {
        cout << "Con2\t" << this <<  endl;
    }
    MyBase2(const MyBase2 &other) {
        cout << "CCon2\t" << this << endl;
    }
    ~MyBase2() {
        cout << "Des2\t" << this << endl;
    }
};

class MyBase12 : public MyBase1, MyBase2
{
public:
    int x12;
    MyBase12() {
        cout << "Con12\t" << this <<  endl;
    }
    MyBase12(const MyBase12 &other) {
        cout << "CCon12\t" << this << endl;
    }
    ~MyBase12() {
        cout << "Des12\t" << this << endl;
    }
};

class MySuperClass : public MyBase12
{
public:
    int xs;
    MySuperClass() {
        cout << "ConS\t" << this << endl;
    }
    MySuperClass(const MySuperClass &other) {
        cout << "CConS\t" << this << endl;
    }
    ~MySuperClass() {
        cout << "DesS\t" << this << endl;
    }
};

void func(MyBase12 r)
{
    cout << "COPY:\t" << &r <<  endl;
}

int main()
{
    const char *delim = "*****************\n";
    MySuperClass o;
    cout << "ORIG:\t" << &o << endl << delim;
    func(o);
    cout << delim;
}
Код:
Con1    0x7fff87579f20
Con2    0x7fff87579f24
Con12   0x7fff87579f20
ConS    0x7fff87579f20
ORIG:   0x7fff87579f20
*****************
Con1    0x7fff87579f30
Con2    0x7fff87579f34
CCon12  0x7fff87579f30
COPY:   0x7fff87579f30
Des12   0x7fff87579f30
Des2    0x7fff87579f34
Des1    0x7fff87579f30
*****************
DesS    0x7fff87579f20
Des12   0x7fff87579f20
Des2    0x7fff87579f24
Des1    0x7fff87579f20
Но хотелось бы увидеть вывод у Janym.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 28.02.2011 в 19:27.
Obey-Kun вне форума Ответить с цитированием
Старый 28.02.2011, 19:31   #43
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Эта прога будет работать нормально. Т.к. в базовом явный КК. Косяк просматривается если он неявный.

Код:
Con1    0012FF4B
Con2    0012FF4C
Con12   0012FF4B
ConS    0012FF4B
ORIG:   0012FF4B
*****************
Con1    0012FE54
Con2    0012FE55
CCon12  0012FE54
COPY:   0012FE54
Des12   0012FE54
Des2    0012FE55
Des1    0012FE54
*****************
DesS    0012FF4B
Des12   0012FF4B
Des2    0012FF4C
Des1    0012FF4B
Press any key to continue . . .
А с адресацией косяк остаётся
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 19:35   #44
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Покажи вывод, будь добр. Вот, без явных КК:
Код:
#include <iostream>
using namespace std;

class MyBase1
{
public:
    MyBase1() {
        cout << "Con1\t" << this << endl;
    }
    ~MyBase1() {
        cout << "Des1\t" << this << endl;
    }
    
};

class MyBase2
{
public:
    MyBase2() {
        cout << "Con2\t" << this <<  endl;
    }
    ~MyBase2() {
        cout << "Des2\t" << this << endl;
    }
};

class MyBase12 : public MyBase1, MyBase2
{
public:
    MyBase12() {
        cout << "Con12\t" << this <<  endl;
    }
    ~MyBase12() {
        cout << "Des12\t" << this << endl;
    }
};

class MySuperClass : public MyBase12
{
public:
    MySuperClass() {
        cout << "ConS\t" << this << endl;
    }
    ~MySuperClass() {
        cout << "DesS\t" << this << endl;
    }
};

void func(MyBase12 r)
{
    cout << "COPY:\t" << &r <<  endl;
}

int main()
{
    const char *delim = "*****************\n";
    MySuperClass o;
    cout << "ORIG:\t" << &o << endl << delim;
    func(o);
    cout << delim;
}
Код:
Con1    0x7fffe7472e06
Con2    0x7fffe7472e06
Con12   0x7fffe7472e06
ConS    0x7fffe7472e06
ORIG:   0x7fffe7472e06
*****************
COPY:   0x7fffe7472e07
Des12   0x7fffe7472e07
Des2    0x7fffe7472e07
Des1    0x7fffe7472e07
*****************
DesS    0x7fffe7472e06
Des12   0x7fffe7472e06
Des2    0x7fffe7472e06
Des1    0x7fffe7472e06
Цитата:
А с адресацией косяк остаётся
Не факт что это косяк.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 28.02.2011, 19:40   #45
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Код:
Con1    0012FF4B
Con2    0012FF4C
Con12   0012FF4B
ConS    0012FF4B
ORIG:   0012FF4B
*****************
COPY:   0012FE4C
Des12   0012FE4C
Des2    0012FE4D
Des1    0012FE4C
Des12   0012FE67
Des2    0012FE68
Des1    0012FE67
*****************
DesS    0012FF4B
Des12   0012FF4B
Des2    0012FF4C
Des1    0012FF4B
Press any key to continue . . .
Посторонний адрес снова.
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 19:41   #46
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

А что покажет Пепел Феникса этот код без КК?
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 19:51   #47
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Janym, а какой версии студия?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 28.02.2011, 19:56   #48
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

2008 Professional Edition.
Janym вне форума Ответить с цитированием
Старый 28.02.2011, 19:56   #49
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Версию для Debug или Release собираешь?
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 28.02.2011, 20:02   #50
Janym
Пользователь
 
Регистрация: 27.02.2011
Сообщений: 22
По умолчанию

Да, но там и там разницы нет
Janym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение свойств объекта не активируя его ndvikulov Microsoft Office Excel 16 16.09.2010 20:14
Передача метода объекта. the_deer_one Общие вопросы C/C++ 8 09.09.2010 15:07
Можно ли в макрос передать имя объекта, его вызывающего buagbu Microsoft Office Excel 3 16.04.2010 08:54
Передача объекта в функцию Юра_YUYU Общие вопросы C/C++ 14 18.01.2010 16:00
Проверка объекта после его уничтожения AHTuKiLLeR Общие вопросы Delphi 1 19.06.2009 10:43