Member 11701154 Ответов: 2

Пожалуйста, объясните, почему конструктор no вызывается для derived2 в первой программе. 2-Я программа не компилируется.


1)ниже программа работает, но никакой конструктор не вызывается для derived2.
#include<iostream>

using namespace std ;
class drived1;

#define SIZE 10

class base
{
public:
int a;
drived1* get_value_object_drived1();

base()
{
cout << "Base Ctor" << endl;
}

};

drived1* base::get_value_object_drived1()
{
a = 20;
return reinterpret_cast<drived1*>((this));
}

class drived1: public base
{
public:
int b;
void displayD1()
{
cout << "drived1 displayD1 is called" << endl;
b = 10;
}

drived1()
{
cout << "drived1 Ctor" << endl;
b = 5;
}


};

class drived2: public base
{
public:
int d_buff[SIZE];

drived2()
{
cout << "drived2 Ctor" << endl;
}

};

void main()
{
base B;
drived2 D2;

D2.get_value_object_drived1()->displayD1();

}

Но ниже один не работает при возврате объекта вместо указателя.
#include<iostream>

using namespace std ;
class drived1;

#define SIZE 10

class base
{
public:
int a;
drived1 get_value_object_drived1();

base()
{
cout << "Base Ctor" << endl;
}

};

drived1 base::get_value_object_drived1()
{
a = 20;
return reinterpret_cast<drived1>((*this));
}

class drived1: public base
{
public:
int b;
void displayD1()
{
cout << "drived1 displayD1 is called" << endl;
b = 10;
}

drived1()
{
cout << "drived1 Ctor" << endl;
b = 5;
}


};

class drived2: public base
{
public:
int d_buff[SIZE];

drived2()
{
cout << "drived2 Ctor" << endl;
}

};

void main()
{
base B;
drived2 D2;

D2.get_value_object_drived1().displayD1();

}


Что я уже пробовал:

1)Первая программа работает, но никакой конструктор не вызывается для derived2. Почему конструктор не вызывается для derived2.
2)но 2-Я программа не работает при возврате объекта вместо указателя того же типа.

2 Ответов

Рейтинг:
2

OriginalGriff

Конструктор не вызывается, потому что вы не создаете экземпляр класса.
Вы выделяете переменную, которая может содержать ее экземпляр:

void main()
    {
    base B;
    drived2 D2;
    ...
    }
Но это не создает никаких экземпляров. Для создания экземпляра вам потребуется new ключевое слово:
void main()
    {
    base B;
    drived2 D2 = new drived2();
    ...
    }


markkuk

Вы путаете C++ с Java.

Рейтинг:
0

Member 11701154

Ошибка во 2-й программе
Ошибка 3 ошибка C2027: использование неопределенного типа 'drived1'
Ошибка 4 ошибка C2079: 'base::get_value_object_drived1' использует неопределенный класс
Ошибка 5 ошибка c2440: 'оператора reinterpret_cast' : не удается конвертировать из 'базы' в 'drived1'