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

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

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

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

14.10.2009, 17:33. Просмотров 474. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2009, 17:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос недоработка С++ или ошибочная логика (C++):

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

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

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

Ошибочная логика расчета - C++ Builder
Прошу помочь. Неправильно рассчитывает значение при if (CheckBox1-&gt;Checked==true) X=X*180/3.14; Сам код. ...

Ошибочная ссылка на процедуру или функцию - Turbo Pascal
program Trapezia; uses crt,graph; const points:array of string=('O_programe','Vvod_dannbix','graphicheskaa_chast','exit'); var...

"ошибочная ссылка на процедуру или функцию" - Turbo Pascal
program LAB5; uses crt; type matr=array of integer; var fl: char; i,j: byte; X, Y, B: matr; ...

3
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
14.10.2009, 18:27 #2
Все правильно, это не недоработка в C++, а ошибочная логика у тебя. Суть в том, что у класса Four оказывается два экземпляра (две базы) класса First - одна, унаследованная от Second, и другая, унаследованная от Third. И как компилятор должен решить, указатель на какую именно базу запихать в p[0] ??? Как он должен угадать, что именно ты имел в виду?
Исправляй код. Лучше всего, нарисуй граф своих классов (хотя бы и в StarUML) и подумай, какие базы и какие члены от них будет наследовать класс Four.
1
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'
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,389
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;
}
1
14.10.2009, 22:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2009, 22:09
Привет! Вот еще темы с ответами:

ГРАФ или логика е-мозгов - C++ Builder
Недавно пришлось вспомнить о старой проблеме, от которой мне удалось в свое время убежать. Суть заключается в следующем имеется...

недоработка - Pascal
уважаемые форумчане, тут произошла такая маленькая недоработка: имеются 2 задачи - 1) Задан целый вектор X(n), n&lt;=16. Сформировать...

недоработка - Delphi
доброго времени суток. помогите. нужно чтобы при нажатии кнопок ползунок вставал в соответствующее положение. вот код: unit Unit1; ...

Обработка прерывания "ошибочная команда" или "неверная команда" - Assembler
Привет форумчани! Очень нужна ваша помощь... Нужно написать программу, которая будит сообщать о том, что в задаче используется неверная...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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