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

Тема в разделе "Общие вопросы по С и С++", создана пользователем shepard90, 16 дек 2010.

  1. shepard90

    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();
    }
     
  2. ierofant

    ierofant Гость

    Никакого косяка. Конструктор копирования, это ведь и есть конструктор потомка, о котором вы говорите!! Поэтому сначала выполняется конструктор базового класса, а потом конструктор потомка, который в данном случае и есть конструктор копирования.
     
Загрузка...
Похожие Темы - Проблема наследованием
  1. AgniXRudra
    Ответов:
    1
    Просмотров:
    8
  2. Zloikaktus
    Ответов:
    0
    Просмотров:
    12
  3. c0de3r
    Ответов:
    5
    Просмотров:
    134
  4. DobermannTT
    Ответов:
    10
    Просмотров:
    139
  5. SoulPaladin
    Ответов:
    4
    Просмотров:
    135

Поделиться этой страницей