Форум программистов, компьютерный форум CyberForum.ru

Базовый класс и производный... - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Поиск слова в предложениях http://www.cyberforum.ru/cpp-beginners/thread170154.html
Программа должна считывать текст из файла, выводить его не экран добавляя в конце каждого предложения сколько раз встретилось в предложении слово введенное с клавиатуры. Помогите плиз.... Все что смог сделать: #include "stdafx.h" #include <iostream> #include <string> using namespace std; int _tmain(int argc, _TCHAR* argv) { string a("bla. bla bla cbla"), c, b="."; cout<<"Vvedit`...
C++ Найти координаты основания высоты. Задача: Треугольник задается координатами своих вершин на плоскости: А(x1, y1), B(x2, y2), C(x3, y3). Найти длину и координаты основание высоты, опущенной из вершины А на сторону ВС. Саму высоту нашла, но координаты не могу. http://www.cyberforum.ru/cpp-beginners/thread170150.html
C++ Никак не могу разобраться с конструктором.
Добрый день. Недавно стал изучать C++. Уже 2 день пытаюсь понять суть конструктора, но не могу. Код который присутствует в книжках, не работает в компиляторах visual C++ 10 и DEV-C++ 4.9.9.2. :( например вот на такой код компилятор говорит: функция член локального класса не имеет тела и подсвечивает строку где у меня конструктор. Хотя в книжках показываются такие примеры class...
Оператор условия в C++ C++
Не как не могу написать программу по данной задаче(вложение)
C++ Найти количество элементов матрицы, значения которых не превышают по абсолютной величине Х http://www.cyberforum.ru/cpp-beginners/thread170115.html
1) Дана матрица О (2,3) Найти кол-во элементов, значения которых не превышают по абсолютной величине Х. Если кол-во больше 3, то найти минимальный элемент. Пожалуйста последний раз прошу такой помощи:::это надо на языке с++ в среде Borland C++ bilder 6
C++ Какие перспективы у C++ в будущем? Какие перспективы у си++ в будущем? Я слышал, что сейчас лучше уже начинать учить си шарп или java? подробнее

Показать сообщение отдельно
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2010, 19:27     Базовый класс и производный...
Подождите, давайте сначала всё рассавим на свои места.

Как я понял, у вас есть 3 класса: Abstarray => Array => MyArray.
В MyArray реализована функция removeEntry, которой нет в Array.
Есть объект Array arrayObject. Вам нужно вызвать arrayObject.removeEntry();

Если я вас правильно понял, то это просто дурдом получается, другого слова не подберёшь. Суть наследования - в том, чтобы выделить общие свойства нескольких классов в один базовый класс. То есть если и для объектов MyArray, и для объектов Array должна быть доступна функция removeEntry, её нужно перенести либо в Array, либо в Abstarray.

Теоретически можно попробовать создать указатель на MyArray, присвоить ему адрес arrayObj и из него вызвать removeEntry, но ничего хорошего от такой техники не ждите. Если компилятор вообще вам такое простит.

Понимаете, допустим есть два класса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class CExampleBase
{
public:
   int baseN;
   void print(){ cout << baseN; };
};
 
class CExample
{
public:
   int anotherN;
   void printBoth(){ print(); cout << "; " << anotherN; };
};
Технически при создании объекта класса выделяется память только под данные этого объекта, то есть, в случае с CExampleBase - под int CExampleBase::baseN. При вызове функции из класса компилятор скрыто от вас выполняет так называемый thiscall, то есть предаёт функции указатель на объект, с которым ей нужно работать:

C++
1
2
3
4
5
6
7
8
//этот код
CExampleBase obj;
obj.print();
 
//технически выглядит так:
struct TExampleBase{ int baseN; } obj;
print( &obj ); //вызов глобальной функции с передачей адреса банальной структуры,
                  //с которой ей нужно работать
При наследовании выглядит так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//этот код
CExample obj;
obj.printBoth();
 
//технически выглядит так:
struct TExample
{ 
   int baseN; 
   int anotherN; //при наследовании данные просто выстраиваются
                      //друг за другом, в порядке наследования
} obj;
 
printBoth( &obj );
Теперь представьте себе:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct TExampleBase
{ 
   int baseN; 
   //int anotherN; // этой переменной тут нет, она появится только в TExample
} obj;
 
printBoth( (TExample*)(&obj) ); // вызываем функцию из TExample
//которая реализована так:
void printBoth( TExample * object )
{
   cout << object.baseN; //тут всё нормально, в нашем TExampleBase obj есть baseN
   cout << "; " << object.anotherN; // ERROR: попытка обратиться к данным, которых нет в структуре TExampleBase
}
То есть подобные дурилки ни к чему хорошему не приводят. Вы рискуете вылести за пределы структуры и хорошо, если не за пределы виртуального адресного пространства программы, то есть вызвать ошибку сегментации памяти. Видели когда-нибудь сообщение вроде "Error: read of address 0x000000"? Вот вы что-то подобное сделаете. Так что перечитывайте задание, скорее всего, либо оно некорректно поставлено, либо вы его некорректно восприняли.

Удачи.
 
Текущее время: 20:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru