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

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

Войти
Регистрация
Восстановить пароль
 
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
#1

Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? - C++

08.04.2013, 21:37. Просмотров 394. Ответов 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
//Абстрактный базовый класс
class Base{
    public:
        // Возвращаем а_
        int getA() {return a_};
        // Эта функция есть у каждого класса
         virtual void Foo() = 0;        
         // Конструктор
         Base(int a) : a_(a);
    private:
        a_;
};
 
// Дочерний класс с дополнительной private
class DerivedA : public Base:
{
   public:
        DerivedA(int a, int c): Base(a), c_(c); 
        void Foo();
   private:
       int c_;
       
} 
 
 
// Дочерний класс без дополнительной private
class DerivedB : public Base:
{
    public:
        
        DerivedB(int a): Base(a); 
        void Foo();
}
 
void main(){
 
    DerivedA A(1, 2);
    DerivedB B(3);
    
    Base* C;
 
    C = new DerivedA(5, 6);
    // Потом как то нужно получить 6
 
}

Где и как написать функцию, чтобы она возвращала значение с_ у объекта С, если это DerivedA (что то вроде С->getC()). Если делать функцию виртуальной в базовом типе, то ее надо описывать в каждом дочернем. Если же проект большой и нужны приватные переменные только у некоторых дочерних типов, то как поступить в таком случае?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2013, 21:37     Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный?
Посмотрите здесь:

Создать абстрактный класс с общими полями и методами. В производных классах перегрузить чисто виртуальную функцию - общая стоимость всех изделий - C++
Помогите пожалуйста!!! Не могу правильно создать абстрактный класс! Создать абстрактный класс с общими полями и методами. В производных...

Абстрактный базовый класс - C++
Привет всем! У меня есть абстрактный базовый класс Object.Он содержит различные методы. Например, virtual void...

Абстрактный базовый класс - C++
Создать абстрактный базовый класс с виртуальной функцией - объем. Создать производные классы: параллелепипед, пирамида, тетраэдр, шар со...

Абстрактный базовый класс - C++
У меня имеется свой некоторый класс, для которого переопределена куча операций, в том числе и операторы + - * /, преподаватель дал задание...

абстрактный базовый класс - C++
люди подскажите.есть абстрактный базовый класс можно ли в нем определить конструктор копирования? написал в компиляторе,получается,что...

абстрактный базовый класс - C++
Создать абстрактный базовый класс с виртуальной функцией – объем. Создать производные классы: параллелепипед, пирамида, шар со своими...

Объясните как объявить абстрактный класс, и при этом не тащить виртуальные методы в производные классы - C++
Суть вопроса - есть у меня класс, который я решаю сделать абстрактным. Как я понимаю что бы сделать класс абстрактным необходимо просто...

Абстрактный базовый класс(задача) - C++
Дано задание :Определите абстрактный базовый класс Person,содержащий поля "пол","возраст". Затем определите производный класс Student,...

Создать абстрактный базовый класс - C++
Помогите: Создать абстрактный базовый класс Container с виртуальными функциями вставки и извлечения. Создать производные классы Stack и...

Создать абстрактный базовый класс список - C++
Создать абстрактный базовый класс список. Реализовать на его базе классы стек и очередь с виртуальными функциями добавления и удаления...

Создать абстрактный базовый класс Figure - C++
Здравствуйте,помогите пожалуйста с задачей. Создать абстрактный базовый класс Figure с виртуальной функцией - площадь поверхности....

Реализовать абстрактный базовый класс «Фигура» - C++
Пожалуйста, помогите решить следующую задачу: Реализовать абстрактный базовый класс «Фигура», содержащий методы вычисления площади и...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.04.2013, 10:44     Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? #2
sl_k, Явный каст, ведь вы знаете что это ИМЕННО тот тип, раз уж собираетесь звать функцию.
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
09.04.2013, 13:29  [ТС]     Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? #3
ForEveR, действительно, static_cast может спасти ситуацию. А если пример будет расширен, и, скажем, 4 из 10 дочерних классов будут иметь эту приватную переменную, и нужно будет ее возвратить?
Тогда нужно уже, наверное, группировать эти 4 класса в другой подкласс и использовать статик_каст из базового в тот класс, который объединяет эти 4 класса. Что то типа такого:
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
66
//Абстрактный базовый класс
class Base{
    public:
        // Возвращаем а_
        int getA() {return a_};
        // Эта функция есть у каждого класса
         virtual void Foo() = 0;        
         // Конструктор
         Base(int a) : a_(a);
    private:
        a_;
};
 
// Класс для группировки дочерних классов с переменной с_
class Derived_Level1 : public Base:
{
   public:
        DerivedA(int a, int c): Base(a), c_(c); 
        int getC() {return c_;};
        void Foo();
   protected:
       int c_;
       
} 
 
 
// Дочерний класс с дополнительной private
class DerivedA : public Derived_Level1:
{
   public:
        DerivedA(int a, int c): Derived_Level1(a, c); 
  
} 
 
// Дочерний класс с дополнительной private
class DerivedB : public Derived_Level1:
{
   public:
        DerivedB(int a, int c): Derived_Level1(a, c); 
  
} 
 
// Дочерний класс без дополнительной private
class Derived : public Base:
{
    public:
        
        Derived(int a): Base(a); 
        void Foo();
}
 
void main(){
 
    DerivedA A(1, 2);
    DerivedB B(3);
    
    Base* C;
 
    C = new DerivedA(5, 6);
    // Потом как то нужно получить 6
 
    static_cast(Derived_Level1)<C>;
    int var;
    var = C->getC();
 
}
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
09.04.2013, 13:31     Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? #4
sl_k, Только не забудьте что при виртуальном наследовании следует использовать dynamic_cast.

скажем, 4 из 10 дочерних классов будут иметь эту приватную переменную
Дополнительный интерфейс и каст к этому интерфейсу ну али так как вы сделали.

Собственно пример маленький с интерфейсом

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
#include <iostream>
 
class Base
{
public:
   virtual ~Base() {}
};
 
class CAble
{
public:
   CAble(int cc) : c(cc)
   {
   }
   virtual ~CAble() {}
   int get() const { return c; }
private:
   int c;
};
 
class CDerived : public Base, public CAble
{
public:
   CDerived() : CAble(0)
   {
   }
};
 
class Derived : public Base
{
};
 
int main()
{
   Base* p = new CDerived();
   CDerived* c = static_cast<CDerived*>(p);
   std::cout << c->get() << std::endl;
   delete p;
}
Yandex
Объявления
09.04.2013, 13:31     Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный?
Ответ Создать тему
Опции темы

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