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

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

Войти
Регистрация
Восстановить пароль
 
PP
0 / 0 / 0
Регистрация: 14.10.2009
Сообщений: 20
#1

недоработка С++ или ошибочная логика - C++

14.10.2009, 17:33. Просмотров 467. Ответов 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
55
56
57
class First
{  
   int a;
  protected:
   string name;
    
 public:
    virtual void setName(string smth)=0;
    int& getInt(){return a;}
    void getName(){ cout<<name;}
 } ;
 
 class Second:public First
 {
   int b;
     
    public:
     void setName(string smth){ name = smth;}
     int& setInt(){return b;}
     
 };
 
 class Third:public First
 {
   int c;
    public:
    Third(int smth):c(smth){}
    Third(){}
     void setName(string smth){ name = smth;}
     int& setInt(){return c;}
    
}; 
 
class Four:public Second,public Third
{
  int d;
  public:
  Four(int smth):d(smth){}
  Four(){}
  };
  
  
 
int main( void )
{   
     First* p[3];
     p[0]=new Four(7);   // !-oshibka?!?  pri mnojestvenom nasledovanii ne poluchaiu dostup k konstruktoru
                                  //  ob'ekta nasledovannogo klassa v dinamicheskoi pamqti cherez ukazatel'
                                  // na etot  ob'ekt  
     Four pF(7);             //    <-----   tol'ko tak razreshaet 
     p[1]=new Third(72); // a vot to je samoe tol'ko na ob'ekt odinochnogo nasledovaniq prodelat' vozmojno
                                 // xotq sintaksis takoije!  Pochemy?!?
     p[1]->setName("Paris");
     p[1]->getName();
          
            return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2009, 17:33     недоработка С++ или ошибочная логика
Посмотрите здесь:

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

Недоработка в компиляторе Visual Studio. <iso646.h>/<ciso646> - C++
Почему это не работает в Visual Studio (в других компиляторах всё работает)? #include &lt;stdio.h&gt; int main() { int a, b; a =...

Дана строка, содержащая латинские буквы и скобки. Если скобки расставлены правильно - вывести 0. Иначе - номер позиции, где есть ошибочная скобка - C++
Дана строка, содержащая латинские буквы и круглые скобки. Если скобки расставлены правильно (то есть каждой открывающей соответству-ет одна...

CTL логика - C++
Подскажите где искать литературу, у меня курсовая на тему : &quot;Написать библиотеку классов функций реализующую CTL логику&quot;. Т.е. необходимо...

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

Логика выражения - C++
Изучать С начал недавно, изучение изучением, а вопрос текущий назрел и в литературе когда появится ответ, не особо известно) В общем...

C++ мат. логика - C++
НАПИШИТЕ прогу pleas (желательно самый оптимальный вариант): дани число n и а=1, а можно умножать на 2 и на 3. Вопрос: как получить из...

Нечеткая логика - C++
Здравствуйте. Помогите пожалуйста с програмкой.

Логика программы - C++
Всем доброго времени суток! Помогите, пожалуйста, понять логику программы (код дан целиком) по теме связанные списки типа очередь. Код взят...

Неверная логика аппы - C++
#include &lt;iostream&gt; using namespace std; int main() { char a; cin.getline(a, 10); int i; for (i = 0;a!='\0';i++)...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
14.10.2009, 18:27     недоработка С++ или ошибочная логика #2
Все правильно, это не недоработка в C++, а ошибочная логика у тебя. Суть в том, что у класса Four оказывается два экземпляра (две базы) класса First - одна, унаследованная от Second, и другая, унаследованная от Third. И как компилятор должен решить, указатель на какую именно базу запихать в p[0] ??? Как он должен угадать, что именно ты имел в виду?
Исправляй код. Лучше всего, нарисуй граф своих классов (хотя бы и в StarUML) и подумай, какие базы и какие члены от них будет наследовать класс Four.
PP
0 / 0 / 0
Регистрация: 14.10.2009
Сообщений: 20
14.10.2009, 19:38  [ТС]     недоработка С++ или ошибочная логика #3
Spasibo,deistvitel'no ti pomog s etim voprosom razobrat'sq.No vse razno nemnogo nelogichno poluchaetsq: s odnoi storoni C++ dopuskaet sozdanie klassa-potomka s dvumq odinakovimi bazami(bud' to v avtomaticheskoi ili dinamicheskoi pamqti) no ukazatel' dlq effektivnoi raboti s nim poluchit' nel'zq(ponql uje po kakim prichinam).Kstati izvinqius' esli nesu chush' prosto nedavno nachal etot qzik uchit'
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
14.10.2009, 22:09     недоработка С++ или ошибочная логика #4
Ничего подобного. Указатель для работы "с ним" (а с кем, собссно?) получить можно. Ну и как ты будешь "с ним" работать? - при получении указателя на базу произойдет т.н. "срезка", slicing. Работать-то ты сможешь только с объектом класса First.....
Примерно так (не проверял!!):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main( void )
{   
     First* p[3];
     p[0]= dynamic_cast<Second*>(new Four(7));   // получаем первую базу
     p[0]= dynamic_cast<Third*>(new Four(7));   // а теперь - вторую
 
     Four pF(7);
     p[1]=new Third(72);  // здесь работаем со второй базой! а не с первой!
 
     p[1]->setName("Paris");
     p[1]->getName();
          
            return 0;
}
Yandex
Объявления
14.10.2009, 22:09     недоработка С++ или ошибочная логика
Ответ Создать тему
Опции темы

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