Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
#1

Наследование класс1 *test = new класс2 - C++

31.07.2013, 21:47. Просмотров 1907. Ответов 54
Метки нет (Все метки)

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream> 
 
class BaseClass // Базовый класс
{
public:
BaseClass(): a(0), b(0) { std::cout << "BaseClass constructor.. \n"; }
BaseClass(int rhs_a, int rhs_b): a(rhs_a), b(rhs_b) { std::cout << "BaseClass constructor.. \n"; }
 
void print() const 
{
std::cout << "a: " << a << "\n";
std::cout << "b: " << a << "\n";
}
 
void printBaseClass() const 
{
std::cout << "a: " << a << "\n";
std::cout << "b: " << a << "\n";
}
 
protected:
int a;
int b;
};
 
 
class DerivedClass : public BaseClass // Производный класс от BaseClass
{
public:
DerivedClass(): x(0), y(0), z(0) { std::cout << "DerivedClass constructor.. \n"; }
DerivedClass(int rhs_x, int rhs_y, int rhs_z): x(rhs_x), y(rhs_y), z(rhs_z) { std::cout << "DerivedClass constructor.. \n"; }
 
void print() const 
{
std::cout << "x: " << x << "\n";
std::cout << "y: " << y << "\n";
std::cout << "z: " << z << "\n";
}
 
void printDerivedClass() const 
{
std::cout << "x: " << x << "\n";
std::cout << "y: " << y << "\n";
std::cout << "z: " << z << "\n";
}
 
protected:
int x;
int y;
int z;
};
 
 
int main()
{
setlocale(LC_ALL,"");
 
BaseClass * test = new DerivedClass;
test->print();
test->printBaseClass();
 
 
system("pause");
return 0;
}


Вот небольшая программка, подскажите в чем смысл записи в строчке 58, только не сухое определение записи, что мы создаем объект класса BaseClass и выделяем под него память типа DerivedClass (или как то так), а на пальцах, в чес смысл в чем плюсы и самое главное
чем данная строка отличалась бы от записи BaseClass * test = new BaseClass ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2013, 21:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование класс1 *test = new класс2 (C++):

C:\Projects\test\test.cpp|6|error: ISO C++ forbids declaration of 'operator++' with no type [-fpermissive]| - C++
class TUID { public: char Data; TUID (); operator ++ (); };

Заменить наследование классов на наследование интерфейсов - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int vehicles_on_base = 100; double...

Задача на класс2 - Delphi
Помогите до реализовать форму программы Спасибо)

Nginx перенаправляет на http://site.ru/test.ru или http://test.ru/test.ru - Debian Linux
Только, что поставил nginx + php-fpm по этой статье - http://dunmaksim.blogspot.ru/2013/12/nginx-php-fpm.html При попытке зайти на сайт...

Функция file_exists(test/01.ogg) работает, если папка test находится в корневом каталоге моего сервера. - PHP
Столкнулся с интересной проблеммой. Функция file_exists(test/01.ogg) работает, если папка test находится в корневом каталоге моего...

Почему команда «dir>test.txt» работает, а команда «ftp /?>test.txt» — нет? - CMD/BAT
Пробовала без пробелов, что тут еще можно попробовать непонятно Выводит в окно командной строки. Как исправить?

54
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
01.08.2013, 14:05  [ТС] #31
Цитата Сообщение от Jupiter Посмотреть сообщение
нет. виртуальнай эта функция будет во всех потомках, независимо от того стоит ли virtual в DerivedClass
т.е. (ключевое слово virtual в строке 9) и (ключевое слово virtual в строках 9 и 19) это одно и тоже и работа у них будет проходить по одному и тому же сценарию (правилам и т.д.)?
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2013, 14:08 #32
Цитата Сообщение от VLK Посмотреть сообщение
т.е. (ключевое слово virtual в строке 9) и (ключевое слово virtual в строках 9 и 19) это одно и тоже и работа у них будет проходить по одному и тому же сценарию (правилам и т.д.)?
да.
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
01.08.2013, 14:10  [ТС] #33
то, что test будет объектом класса DerivedClass я понял, вопрос, т.е. когда не ясно какую функцию-элемент вызывать всегда вызывается функция-элемент базового класса?
И смысл тут заключается исключительно в неясности?
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.08.2013, 14:20 #34
Цитата Сообщение от VLK Посмотреть сообщение
вопрос, т.е. когда не ясно какую функцию-элемент вызывать всегда вызывается функция-элемент базового класса?
перефразируй вопрос

Цитата Сообщение от VLK Посмотреть сообщение
И смысл тут заключается исключительно в неясности?
да в неясности какой же метод будет вызван и пофигизме, пример:
у нас есть фигуры и нам пофигу что это за фигуры, мы хотим их нарисовать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
class Figure
{
public:
    virtual void draw() const = 0;
 
    virtual ~Figure() {}
};
 
class Circle : public Figure
{
    virtual void draw() const
    {
       std::cout << "draw circle" << std::endl;
    }
};
 
class Square : public Figure
{
    virtual void draw() const
    {
       std::cout << "draw square" << std::endl;
    }
};
 
int main()
{
    Circle a, b;
    Square c;
    Figure* arr[] = { &a, &c, &b };
 
    for (int i = 0; i < 3; ++i)
        arr[i]->draw();
}
2
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
01.08.2013, 14:20 #35
Цитата Сообщение от VLK Посмотреть сообщение
test будет объектом класса DerivedClass
test - это не объект, а указатель, он просто хранит адрес объекта. В указателе никак не прописано, на объект какого именно класса он указывает - базового или производного.

Если используется статического связывание (невиртуальные функции), то выбор функции будет произведен на основе типа указателя на этапе линковки.

Если динамическое связывание (виртуальные функции) - то функция выберется в зависимости от конкретного типа объекта, адрес которого присвоен указателю, на этапе выполнения.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6511 / 3148 / 308
Регистрация: 04.12.2011
Сообщений: 8,711
Записей в блоге: 5
01.08.2013, 14:44 #36
Цитата Сообщение от Jupiter Посмотреть сообщение
да в неясности какой же метод будет вызван и пофигизме
В полифигизме всё дело (имхо).
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
01.08.2013, 14:48  [ТС] #37
Цитата Сообщение от Jupiter Посмотреть сообщение
перефразируй вопрос
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
class BaseClass // Базовый класс
{
public:
BaseClass() { std::cout << "BaseClass constructor.. \n"; }
virtual ~BaseClass() { std::cout << "BaseClass destructor.. \n"; }
 
void print() const
{ std::cout << "in BaseClass \n"; }
};
  
class DerivedClass : public BaseClass // Производный класс от BaseClass
{
public:
DerivedClass() { std::cout << "DerivedClass constructor.. \n"; }
virtual ~DerivedClass() { std::cout << "DerivedClass destructor.. \n"; }
 
void print() const
{ std::cout << "in DerivedClass \n"; }
};
  
int main()
{
setlocale(LC_ALL,"");
 
BaseClass *test = new DerivedClass;
test->print();
 
system("pause");
return 0;
}


Вот пример, тоже что приводилось на предыдущей странице ранее, толь без использование virtual (разве что деструктор, но он погоды тут не делает), мы создаем объект test, он является объектом класса DerivedClass (опустим тот момент, что это не объект, а указатель на объект), соответственно в обоих классах есть одна и та же функция-элемент - print()

По логике, если объект test относится к классу DerivedClass, то и функция элемент print() должна вызываться из этого класса, но на деле происходит обратное..

Тогда мы меняем логику, если есть 2 класса, один является наследником другого, и в обоих присутствует одна и та же по наименованию функция-элемент, то при обращении к ней если не указано явно, к какой именно, программа \ компилятор, всегда будет обращаться к функции элементу базового класса, правильно?

И второе, что бы указать явно программе \ компилятору к чему именно обращаться, существует ключевое слово virtual, если оно присутствует, то программа будет обращаться НЕ к базовому классу, а к производному классу (речь пока идет 2-х классах), правильно?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
01.08.2013, 14:54 #38
Цитата Сообщение от VLK Посмотреть сообщение
но на деле происходит обратное..
потому что пост #8
Цитата Сообщение от Croessmah Посмотреть сообщение
Зато показывает, что без использования полиморфизма используется статическое связывание, поэтому все функции будут проставлены в зависимости от типа указателя, а не от типа созданного реально объекта, как это было бы если бы функции были виртуальны и использовалось бы динамическое связывание
Добавлено через 1 минуту
Цитата Сообщение от VLK Посмотреть сообщение
всегда будет обращаться к функции элементу базового класса, правильно?
Какой указатель, к тому и привяжется.

Добавлено через 58 секунд
Цитата Сообщение от VLK Посмотреть сообщение
компилятору к чему именно обращаться, существует ключевое слово virtual
virtual нужен для позднего связывания
2
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
01.08.2013, 15:08  [ТС] #39
ох.. я только что то нащупаю, как вы мне даете новую порцию непонятных мне слов и словосочетаний.. "позднего связывания", "статическое связывание" и т.д.

Ладно, пойду поем и продолжу изучение (ну как можно учится на голодный желудок..)

Ни куда не уходите
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6511 / 3148 / 308
Регистрация: 04.12.2011
Сообщений: 8,711
Записей в блоге: 5
01.08.2013, 15:41 #40
Цитата Сообщение от VLK Посмотреть сообщение
Ни куда не уходите
Да тута мы все.
Я вот подумал: чтобы понять зачем нужен полиморфизм, нужно же сначала понять зачем он не нужен? То есть простая идея многократного использования кода, без его модификации. Пример опять мутный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
using namespace std; 
class A
{
public:     
A()
:x(0)
{
cout<<"default constr"<<endl;}
A(int a)
{
cout<<"one param constr"<<endl;
x=a;
 }
A(A& rhs){
x=rhs.getX();
 }
 A& operator=(A& rhs){
x=rhs.getX();
return *this;
 }
 int getX(){return x;} 
static const char* ch_constA;
    private:
        int x;
        
        static const char* ch_const_Init(){
return "abcdefgh";
        }
};
const char* A::ch_constA=A::ch_const_Init();
 
class B :public A
{
public:
B()
:A(0)
{}
B(int a)
:A(a)
{}
static const char* ch_constB;//мы не можем избавиться от ch_constA, но можем определить новую
//при этом не затрагивая базовый класс
 
static const char* ch_const_Init(){//функцию инициализации базового класса используем для определения новой)
//тут удобно скрыть метод базового класса новым
return "iklmnoprst";
        }
};
const char* B::ch_constB=B::ch_const_Init();//вызывается для B
 
 
int main() {
A a = 'a';
cout<<a.getX()<<endl;
B c = 'a' + 5;
cout<<c.getX()<<endl;
cout<<c.ch_constB<<endl;
std::system("pause"); 
    return 0;
}
В этом случае перекрытие метода базового класса помогает.
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
01.08.2013, 15:44  [ТС] #41
Цитата Сообщение от Schizorb Посмотреть сообщение
test - это не объект, а указатель, он просто хранит адрес объекта. В указателе никак не прописано, на объект какого именно класса он указывает - базового или производного.
Тогда вопрос, BaseClass *test = new DerivedClass, если test указывает на объект класса DerivedClass т.е. конечный объект будет объектом класса DerivedClass, то какой смысл в данной записи несет "слово" BaseClass для чего оно тут?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
01.08.2013, 15:49 #42
Что-то вроде этого:
Наследование класс1 *test = new класс2
2
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
01.08.2013, 16:21  [ТС] #43
Жесть конечно с переходом на картинки, но что поделать..

Наследование класс1 *test = new класс2

Я все правильно намалевал? опустим тот момент что когда используется virtual, что создается еще одна таблица исключительно с виртуальными функциями

Там есть некоторые недомолвки, в частности:

class DerivedClass : public BaseClass

и print() НЕ virtual функция, show() virtual функция
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
01.08.2013, 16:28 #44
Цитата Сообщение от VLK Посмотреть сообщение
опустим тот момент что когда используется virtual, что создается еще одна таблица исключительно с виртуальными функциями
Вот когда поймете как это устроено, тогда и проблем не будет, а если будете опускать всё подряд - ничего не поймете!
1
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
01.08.2013, 16:37  [ТС] #45
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот когда поймете как это устроено, тогда и проблем не будет, а если будете опускать всё подряд - ничего не поймете!
Я пытаюсь, но с каждый разом как я что то нащупываю, вы мне выдаете что то новое за место конкретного ответа, верно или нет, что все дальше и дальше уводит от истины.
Когда же начинаешь изучать С++, там же не объясняют сразу как работает ввод и вывод из потока (<< >>) т.к. это сложно, только в конце показывают. т.к. обучение должно идти от простого к сложному, а не только сложно.
0
01.08.2013, 16:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2013, 16:37
Привет! Вот еще темы с ответами:

У себя на локале я пишу ссылку test.php?city=1 и в test.php он видет $city==1 - PHP
У себя на локале я пишу ссылку test.php?city=1 и в test.php он видет $city==1 А на хосте не видет. Че это за херня?????

Переименовать ссылку с такой http://test-site.ru/manage на http://test-site.ru/script.php?params=manage - Apache, htaccess
помогите переименовать ссылку с такой http://test-site.ru/manage на http://test-site.ru/script.php?params=manage ...

Реализовать функцию (@COUNT object list test) и (@COUNT-IF test list) - Lisp
Реализовать функции (@COUNT object list test) и (@COUNT-IF test list) , возвращающие количество элементов в списке list, для которых (test...

Test={pero:"lorem"} var t="pero"; console.log(test.t) возможно ли такое ? - JavaScript
Здравствуйте возможно ли такое ? и если да как правильно это написать ? var test={ pero: &quot;lorem 000&quot;, ats: &quot;lorem 123&quot;, kor:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.