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

Наследование классов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.89
.4rray
8 / 8 / 0
Регистрация: 15.12.2010
Сообщений: 41
15.12.2010, 21:09     Наследование классов #1
Как правильно построить наследование, чтобы класс C мог корректно использовать A : Show() ?
Например имеем:
AB.h:
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
class A {
 
 private:
    int a;
    int b;
 
 public:
    A(int x, int y)
    {
        a = x;
        b = y;
    }
    virtual void Show()
    {
        printf("%d %d\n",a,b);
    }
};
 
class B : public A {
 
 private:
    int a;
    int b;
 
 public:
     B(int x, int y) : A(x, y)
     {
     }
};
 
class C : public B {
 
 private:
    int a;
    int b;
    int c;
 
 public:
     C(int x, int y, int z) : B(x,y)
     {
         c = z;
     }
 
     void Show()         // понятно, что так неправильно
     {
         printf("%d\n",c);
     }
};
Main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include "conio.h"
#include "AB.h"
 
int main()
{
    B t(2,3);
    t.Show();
 
    C h(7,8,9);
    h.Show();
    getch();
    return 0;
}
Вроде бы все должно быть просто, но вот заступорился
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2010, 21:09     Наследование классов
Посмотрите здесь:

C++ наследование классов
C++ Наследование классов
C++ Наследование Классов
C++ Наследование классов
C++ Наследование классов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
deadlock
 Аватар для deadlock
372 / 351 / 7
Регистрация: 14.12.2010
Сообщений: 1,265
16.12.2010, 09:31     Наследование классов #2
ну так и действительно ничего сложного. тебе нужно, чтобы для объектов разных типов использовалась одна и та же функция, названная буржуями виртуальной. ну и переопределяешь ее для каждого типа объектов и пользуешься

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
class A
{
 
 private:
 public:
        A()
        {}
        virtual void Show()=0;
};
 
class B : public A
{
 
 private:
        int a;
        int b;
 
 public:
         B(int x, int y)
         {
             a=x;b=y;
         }
         void Show()
         {
             printf("%d %d\n",a,b);
         }
};
 
class C : public B
{
 
 private:
        int a;
        int b;
        int c;
 
 public:
         C(int x, int y, int z):B(x,y)
         {
             a=x;
             b=y;
             c=z;
         }
 
         void Show()
         {
             printf("%d %d %d\n",a,b,c);
         }
};
 
int main(int argc, char *argv[])
{
    B t(2,3);
    t.Show();
 
    C h(7,8,9);
    h.Show();
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
16.12.2010, 10:15     Наследование классов #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не стоит переопределять поля класса в потомках.Воспользуйтесь акцессорами и мутаторами.
Акцессор это функция, возвращающая некое свойство класса, а мутатор это функция изменяющая некоторое свойство класса.

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
#include <iostream>
#include <cstdio>
 
using namespace std;
 
class A
{
private:
        int a;
        int b;
public:
        A(int x, int y) : a(x), b(y) {} // для краткости
        virtual void Show() { printf("%d %d\n",a,b); }
 
        // accessors
        int GetA() { return a; }
        int GetB() { return b; }
        // mutators
        void SetA(int x) { a=x; }
        void SetB(int y) { b=y; }
};
class B : public A {
// не нужно
//private:
//        int a;
//       int b;
public:
         B(int x, int y) : A(x, y) {}
};
 
class C : public B
{
private:
        // не нужно
        //int a;
        //int b;
        int c;
public:
        C(int x, int y, int z) : B(x, y), c(z) { }
        int GetC() { return c; }
        void SetC(int z) {c=z;}
        virtual void Show()
        {
                printf("%d %d %d\n", GetA(), GetB(), GetC());
        }
};
int main(int argc, char *argv[])
{
 
        B* b = new C(1, 2, 3);
 
        b->Show();
        return 0;
}
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
16.12.2010, 10:16     Наследование классов #4
Чтобы переопределить функцию в наследуемом классе ты должен создать ее тоже как виртуальную

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class C : public B {
 
 private:
        int a;
        int b;
        int c;
 
 public:
         C(int x, int y, int z) : B(x,y)
         {
                 c = z;
         }
 
         virtual void Show()   
         {
                 printf("%d\n",c);
         }
};
а то что ты написал в классе С называется сокрытием функции
deadlock
 Аватар для deadlock
372 / 351 / 7
Регистрация: 14.12.2010
Сообщений: 1,265
16.12.2010, 10:29     Наследование классов #5
Цитата Сообщение от Manjak Посмотреть сообщение
Чтобы переопределить функцию в наследуемом классе ты должен создать ее тоже как виртуальную

а то что ты написал в классе С называется сокрытием функции
ничего подобного, виртуальными функции являются в абстрактных классах и классах-родителях, в потомках, если от них нет наследников, переопределяющих эти функции virtual не обязательно.
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
16.12.2010, 11:08     Наследование классов #6
Изучи язык, потом умничай
deadlock
 Аватар для deadlock
372 / 351 / 7
Регистрация: 14.12.2010
Сообщений: 1,265
16.12.2010, 11:13     Наследование классов #7
аналогично
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
16.12.2010, 16:52     Наследование классов #8
Manjak, ты не прав.
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
16.12.2010, 18:42     Наследование классов #9
Да, забыл, что функция с идентичной сигнатурой автоматически считается виртуальной, а не перекрывает функцию родительского класса.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
17.12.2010, 17:21     Наследование классов #10
Ничего подобного. Функция с идентичной сигнатурой не считается виртуальной, а просто перекрывает функцию предка. Виртуальной функция будет только в том случае, если она объявлена в предке с ключевым словом virtual.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
17.12.2010, 19:26     Наследование классов #11
Nick Alte, виртуальная функция является таковой для всей иерархии, а не только на один уровень наследования.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
struct A {
    virtual void show () const { std::cout << "A::show()" << std::endl; }
};
 
struct B : A {
    void show () const { std::cout << "B::show()" << std::endl; }
};
 
struct C : B {
    void show () const { std::cout << "C::show()" << std::endl; }
};
 
int main (int argc, char * const argv[]) {
    B * c = new C;
    
    c->show();
 
    return 0;
}
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
17.12.2010, 23:59     Наследование классов #12
Nick Alte, ты в код ТС вчитайся сначала.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
18.12.2010, 22:20     Наследование классов #13
volovzi, я и не говорил про один уровень. Предки - они разные бывают.

Manjak, применительно к коду ТС такое утверждение справедливо, но лучше всё-таки уточнять, чтобы утверждение не выглядело носящим всеобщий характер. Нас, таких вот невнимательных, много
Manjak
18.12.2010, 22:55
  #14

Не по теме:

Знаю, сам часто ляпну не вчитываясь, потом приходится выкручиваться

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2010, 21:51     Наследование классов
Еще ссылки по теме:

наследование классов C++
Наследование классов C++
C++ Наследование классов

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

Или воспользуйтесь поиском по форуму:
.4rray
8 / 8 / 0
Регистрация: 15.12.2010
Сообщений: 41
23.12.2010, 21:51  [ТС]     Наследование классов #15
Спасибо всем, кто помогал. Когда создавал тему ещё толком не знал, что мне нужно
В итоге сам разобрался. В классе А надо было определить функцию Show как чисто виртуальную, а в потомках уже определять её как будет нужно.
Yandex
Объявления
23.12.2010, 21:51     Наследование классов
Ответ Создать тему
Опции темы

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