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

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

Восстановить пароль Регистрация
 
sl_k
12 / 12 / 0
Регистрация: 15.04.2010
Сообщений: 61
08.04.2013, 21:37     Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный? #1
Как объявить функцию, которая имеет место быть только в некоторых дочерних классах?
Например

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++ абстрактный базовый класс
Абстрактный базовый класс(задача) C++
C++ Создать абстрактный базовый класс список
Абстрактный базовый класс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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     Как объявить функцию, которая имеет место быть только в некоторых дочерних классах, а базовый класс абстрактный?
Ответ Создать тему
Опции темы

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