• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Проблема с наследованием

  • Автор темы shepard90
  • Дата начала
S

shepard90

Добрового времени суток, форумчане!
возникла такая проблема.
Дело в том, что, непонятно каким образом, во всех методах производного класса, где входным параметром является объект того же класса при запуске конструктора-копировщика начинает выполняться конструктор по умолчанию базового класса и при этом в дальнейшем не выполняется конструктор потомка. Что за бред? Никак не догоню? Может косяк засел где-то глубже и поэтому я не могу его найти?

C++:
// Laba7.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include <iostream>
using namespace std;

class Vector
{
protected:
int *mass; // указатель на начало вектора
int count; // количество элементов в векторе
public:
Vector();
Vector(int i); // конструктор (назначен параметр по умолчанию)
~Vector(); // деструтор (не может иметь параметров)
int item(int i) const; // возвращает указанный элемент
void assign(int i, int x); // назначение элемента
int num(); // возвращает число элементов (inline)
int norm(); // возвращает квадрат нормы вектора
};

Vector::Vector()
{
count=2;// двойка здесь присвоена для того, чтобы программа, в ходе исправления, выполнялась без ошибок.
}
Vector::Vector(int i)
{ int j;
count=i;
mass=new int[count];
for (j=0; j<count; j++)
{
mass[j]=0;
}
cout << "vector created " << count << "\n";
}

Vector::~Vector()
{
delete mass;
cout << "vector destroyed\n";
}

int Vector::item(int i) const
{ if ((i>=0) && (i<count)) return *(mass+i);
else {cout << "Error in vector::item"; return 0;}
}

void Vector::assign(int i, int x)
{
if ((i>=0) && (i<count)) *(mass+i)=x;
else cout << "Error in vector::assign";
}
int Vector::num() 
{ return count; }
int Vector::norm()
{ int i;
int x=0;
for (i=0; i<count; i++) x+=mass[i]*mass[i];
return x;
}


class threeVector: public Vector
{
public:
threeVector();//конструктор без параметрров
threeVector(int *arr, int n);//передаю указатель на массив и длину массива
threeVector(int n);//только длину
~threeVector();//деструктор
threeVector(threeVector &rhs);//конструктор-копировщик
void OrtVectors(threeVector Vec1, threeVector Vec2);//проверка на ортогональность
int SearchKomp();// поиск компонента вектора
threeVector & operator=(threeVector &rhs);
//int & operator[](int i);
threeVector operator*(threeVector &rhs);
void SetKomp(int x,int i);
};
threeVector::threeVector():Vector()//конструктор
{
int j;
count=1;
mass=new int[count];
for (j=0; j<count; j++) *(mass+j)=0;
cout << "threeVector created " << count << "\n";
}
threeVector::threeVector(int *arr, int n):Vector(n)//конструктор
{
mass=arr;
cout << "threeVector created " << count << "\n";
}
threeVector::threeVector(int n):Vector(n)//конструктор
{
cout<<"threeVector created "<<count<<"\n";
}
threeVector::~threeVector()//деструктор
{
cout<<"threeVector destroed\n";
}
threeVector::threeVector(threeVector &rhs) //коструктор-копировщик
{
int i;
mass=new int[count];
for(i=0;i<count;i++)
{
mass[i]=rhs.item(i);

}

}
void threeVector::OrtVectors(threeVector Vec1, threeVector Vec2)
{
int i;
int len;
if(Vec1.num()<Vec2.num())
{len=Vec1.num(); }
else 
{len=Vec2.num();}
for(i=0;i<len;i++)
{
if(Vec1.item(i)==0 && Vec2.item(i)==1 || Vec1.item(i)==1 && Vec1.item(i)==0) 
{
printf("Vectors ortogonal\n");
break;
}
else
{
if(i==len-1) printf("Vectors not ortogonal\n");
}
}

}

int threeVector::SearchKomp()
{
int i;
int len;
int j;
j=0;
len=count;
for(i=0;i<len;i++)
if(mass[i]==2) j++;
return j;
}
threeVector & threeVector::operator=(threeVector & rhs)
{
int i;
if(this==&rhs)
return *this;
for(i=0;i<count;i++)
mass[i]=rhs.item(i);
return *this;
}
//int & threeVector::operator[](int i)
//{
//if ((i>=0) && (i<count)) return mass[i];
//else {cout << "Error in vector::item"; return mass[0];}
//}
threeVector threeVector::operator*(threeVector &rhs)
{
int i;
threeVector Vec(count);
for(i=0;i<count;i++)
{
if(mass[i]<=rhs.item(i))
{
Vec.SetKomp(mass[i],i);
}
else
{
Vec.SetKomp(rhs.item(i),i);
}
}
return Vec;
}
void threeVector::SetKomp(int x,int i)
{
mass[i]=x;
}



int _tmain(int argc, _TCHAR* argv[])
{
threeVector V1(2),V2(2),V3(2);
V1.SetKomp(2,0);
V1.SetKomp(0,1);
V2.SetKomp(2,0);
V2.SetKomp(2,1);
V3=V1*V2;
cout<<V1.item(0)<<endl;
cout<<V1.item(1)<<endl;
cout<<V2.item(0)<<endl;
cout<<V2.item(1)<<endl;
cout<<V3.item(0)<<endl;
cout<<V3.item(1)<<endl;
V1.OrtVectors(V1,V2);
cout<<"kolvo komponent ravnih 2: "<<V2.SearchKomp()<<endl;
_getch();
}
 
I

ierofant

Никакого косяка. Конструктор копирования, это ведь и есть конструктор потомка, о котором вы говорите!! Поэтому сначала выполняется конструктор базового класса, а потом конструктор потомка, который в данном случае и есть конструктор копирования.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!