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

виртуальные базовые классы - C++

Восстановить пароль Регистрация
 
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
27.07.2013, 15:08     виртуальные базовые классы #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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Using virtual base classes.
#include <iostream>
using std::cout;
using std::endl;
 
#include <string>
using std::string;
 
// class Base definition
class Base 
{
public:
    Base(string message)
    {
        cout<<message<<endl;
    }
   virtual void print() const = 0; // pure virtual
}; // end class Base
 
// class DerivedOne definition
class DerivedOne : virtual public Base 
{
public:
    DerivedOne(string message)
        :Base(message)
    {}
   // override print function                    
   void print() const 
   {
      cout << "DerivedOne\n";
   } // end function print
}; // end DerivedOne class
 
// class DerivedTwo definition
class DerivedTwo : virtual public Base 
{
public:
    DerivedTwo(string message)
        :Base(message)
    {}
   // override print function                    
   void print() const 
   {
      cout << "DerivedTwo\n";
   } // end function print
}; // end DerivedTwo class
 
// class Multiple definition
class Multiple : public DerivedOne, public DerivedTwo 
{
public:
   // qualify which version of function print
   void print() const                        
   {                                         
      DerivedTwo::print();                   
   } // end function print                   
}; // end Multiple class
 
int main()
{
    Multiple both("Multiple="); // instantiate Multiple object
    DerivedOne one("DerivedOne="); // instantiate DerivedOne object
    DerivedTwo two("DerivedTwo="); // instantiate DerivedTwo object
    
    // declare array of base-class pointers and initialize
    // each element to a derived-class type
    Base *array[ 3 ];
    array[ 0 ] = &both;
    array[ 1 ] = &one;
    array[ 2 ] = &two;
    
    // polymorphically invoke function print
    for ( int i = 0; i < 3; i++ )
        array[ i ]->print();
    
    return 0;
} // end main
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 15:15     виртуальные базовые классы #2
Цитата Сообщение от slipp1 Посмотреть сообщение
какие требования предъявляются к иерархии наследования??
это вы у нас спрашиваете?

Цитата Сообщение от slipp1 Посмотреть сообщение
попитался реализовать...
при виртуальном наследовании за инициализацию предка - Base отвечает потомок - Multiple
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
27.07.2013, 15:33  [ТС]     виртуальные базовые классы #3
Цитата Сообщение от Jupiter Посмотреть сообщение
это вы у нас спрашиваете?


при виртуальном наследовании за инициализацию предка - Base отвечает потомок - Multiple
тогда по логике должно быть так?
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Using virtual base classes.
#include <iostream>
using std::cout;
using std::endl;
 
#include <string>
using std::string;
 
// class Base definition
class Base 
{
public:
    Base(string message)
    {
        cout<<message<<endl;
    }
   virtual void print() const = 0; // pure virtual
}; // end class Base
 
// class DerivedOne definition
class DerivedOne : virtual public Base 
{
public:
    /*
    DerivedOne(string message)
        :Base(message)
    {}
    */
   // override print function                    
   void print() const 
   {
      cout << "DerivedOne\n";
   } // end function print
}; // end DerivedOne class
 
// class DerivedTwo definition
class DerivedTwo : virtual public Base 
{
public:
    /*
    DerivedTwo(string message)
        :Base(message)
    {}
    */
   // override print function                    
   void print() const 
   {
      cout << "DerivedTwo\n";
   } // end function print
}; // end DerivedTwo class
 
// class Multiple definition
class Multiple : public DerivedOne, public DerivedTwo 
{
public:
    Multiple(string message)
        :Base(message)//DerivedOne(message), DerivedTwo(message)
    {}
   // qualify which version of function print
   void print() const                        
   {                                         
      DerivedTwo::print();                   
   } // end function print                   
}; // end Multiple class
 
int main()
{
    Multiple both("Multiple="); // instantiate Multiple object
    DerivedOne one("DerivedOne="); // instantiate DerivedOne object
    DerivedTwo two("DerivedTwo="); // instantiate DerivedTwo object
    
    // declare array of base-class pointers and initialize
    // each element to a derived-class type
    Base *array[ 3 ];
    array[ 0 ] = &both;
    array[ 1 ] = &one;
    array[ 2 ] = &two;
    
    // polymorphically invoke function print
    for ( int i = 0; i < 3; i++ )
        array[ i ]->print();
    
    return 0;
} // end main
Добавлено через 9 минут
вроде заработало.
только не до конца разобралсо... почему??

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Using virtual base classes.
#include <iostream>
using std::cout;
using std::endl;
 
#include <string>
using std::string;
 
// class Base definition
class Base 
{
public:
    Base(string message)
    {
        cout<<message<<endl;
    }
   virtual void print() const = 0; // pure virtual
}; // end class Base
 
// class DerivedOne definition
class DerivedOne : virtual public Base 
{
public:
    DerivedOne(string message)
        :Base(message)
    {}
   // override print function                    
   void print() const 
   {
      cout << "DerivedOne\n";
   } // end function print
}; // end DerivedOne class
 
// class DerivedTwo definition
class DerivedTwo : virtual public Base 
{
public:
    DerivedTwo(string message)
        :Base(message)
    {}
    
   // override print function                    
   void print() const 
   {
      cout << "DerivedTwo\n";
   } // end function print
}; // end DerivedTwo class
 
// class Multiple definition
class Multiple : public DerivedOne, public DerivedTwo 
{
public:
    Multiple(string message)
        :Base(message),DerivedOne(message), DerivedTwo(message)
    {}
   // qualify which version of function print
   void print() const                        
   {                                         
      DerivedTwo::print();                   
   } // end function print                   
}; // end Multiple class
 
int main()
{
    Multiple both("Multiple="); // instantiate Multiple object
    DerivedOne one("DerivedOne="); // instantiate DerivedOne object
    DerivedTwo two("DerivedTwo="); // instantiate DerivedTwo object
    
    // declare array of base-class pointers and initialize
    // each element to a derived-class type
    Base *array[ 3 ];
    array[ 0 ] = &both;
    array[ 1 ] = &one;
    array[ 2 ] = &two;
    
    // polymorphically invoke function print
    for ( int i = 0; i < 3; i++ )
        array[ i ]->print();
    
    return 0;
} // end main
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 15:37     виртуальные базовые классы #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
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <string>
 
class Base 
{
protected:
   Base() {}
public:
    Base(const std::string& message)
    {
        std::cout << message << std::endl;
    }
 
   virtual void print() const = 0;
}; 
 
class DerivedOne : virtual public Base 
{
protected:
    DerivedOne() {}
public:
    DerivedOne(const std::string& message)
    : Base(message)
    {}
    
   void print() const 
   {
      std::cout << "DerivedOne" << std::endl;
   }
};
 
class DerivedTwo : virtual public Base 
{
protected:
    DerivedTwo() {}
public:
    DerivedTwo(const std::string& message)
    : Base(message)
    {}
    
    void print() const 
    {
        std::cout << "DerivedTwo" << std::endl;
   } 
}; 
 
class Multiple : public DerivedOne, public DerivedTwo 
{
public:
    Multiple(const std::string& message)
    : Base(message)
    {}
 
    void print() const                        
    {
        std::cout << "Multiple" << std::endl;                               
    }
};
 
int main()
{
    Multiple both("Multiple=100500"); // instantiate Multiple object
    DerivedOne one("DerivedOne="); // instantiate DerivedOne object
    DerivedTwo two("DerivedTwo="); // instantiate DerivedTwo object
    
    // declare array of base-class pointers and initialize
    // each element to a derived-class type
    Base *array[ 3 ];
    array[ 0 ] = &both;
    array[ 1 ] = &one;
    array[ 2 ] = &two;
    
    // polymorphically invoke function print
    for ( int i = 0; i < 3; i++ )
        array[ i ]->print();
    
    return 0;
}

Не по теме:

черт бы побрал ваши комментарии в коде

slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
27.07.2013, 16:02  [ТС]     виртуальные базовые классы #5
Ваш вариант определяет
такие конструкторы:
C++
1
2
3
Base() {}
DerivedOne() {}
DerivedTwo() {}
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
class Base 
{
protected:
   Base() {}
public:
    Base(const std::string& message)
    {
        std::cout << message << std::endl;
    }
}; 
 
class DerivedOne : virtual public Base 
{
protected:
    DerivedOne() {}
public:
    DerivedOne(const std::string& message)
    : Base(message)
    {}
};
 
class DerivedTwo : virtual public Base 
{
protected:
    DerivedTwo() {}
public:
    DerivedTwo(const std::string& message)
    : Base(message)
    {}
}; 
 
class Multiple : public DerivedOne, public DerivedTwo 
{
public:
    Multiple(const std::string& message)
    : Base(message)
    {}
};
 
}
мой вариант не определяет "пустых конструкоров"
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
class Base 
{
public:
    Base(string message)
    {
        cout<<message<<endl;
    }
};
 
class DerivedOne : virtual public Base 
{
public:
    DerivedOne(string message)
        :Base(message)
    {}
};
 
class DerivedTwo : virtual public Base 
{
public:
    DerivedTwo(string message)
        :Base(message)
    {}
};
 
class Multiple : public DerivedOne, public DerivedTwo 
{
public:
    Multiple(string message)
        :Base(message), DerivedOne(message), DerivedTwo(message)
    {}
                 
};
как будет правильней??
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.07.2013, 16:09     виртуальные базовые классы #6
и так и так правильно, просто в этом коде вызывать конструкторы DerivedOne, DerivedTwo с параметрами смысла нет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 16:11     виртуальные базовые классы
Еще ссылки по теме:

Виртуальные функции и классы C++
Базовые и порожденные классы C++
C++ Абстрактные классы. Виртуальные функции

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

Или воспользуйтесь поиском по форуму:
slipp1
12 / 11 / 1
Регистрация: 09.11.2012
Сообщений: 365
Записей в блоге: 1
27.07.2013, 16:11  [ТС]     виртуальные базовые классы #7
спасибо.
Yandex
Объявления
27.07.2013, 16:11     виртуальные базовые классы
Ответ Создать тему
Опции темы

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