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

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

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

Как вызвать оператор базового класса в наследнике? - C++

04.02.2013, 14:59. Просмотров 863. Ответов 8
Метки нет (Все метки)

Всем привет!

Имеется такая конструкция (мой вопрос - в комментарии к последнему классу):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A {
  A();
  ~A();
  virtual void operator @ (const char* s) {}
};
 
//этот класс использует оператор @ базового класса
class B {
  B();
  ~B();
};
 
class C {
  C();
  ~C();
  virtual void operator @(const char* s) {
    //ряд дополнительных действий
    //здесь хочу вызвать оператор @ базового класса: как это сделать?
  }
};
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2013, 14:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как вызвать оператор базового класса в наследнике? (C++):

В наследнике не видно членов базового класса - C++
в чем ошибка кто подскажет? )).... val не видит #include<iostream> #include<conio.h> using namespace std; class Base { ...

Ошибка. В классе наследнике все элементы, которые были унаследованы от базового класса - C++
выполняя лабу для института, столкнулся с интересной штукой: компилятор выдает, что в классе наследнике все элементы, которые были...

Реализовать оператор= для присваивания объекта класса-потомка объекту базового класса - C++
Есть два класса A и B, причем класс B является потомком A. Как реализовать следующее: obj_A = obj_B и obj_B = obj_A? Добавлено через 9...

Вызвать из базового класса методы потомков - C++
Я не уверен как сделать, но нужно с базового вызвать все другие функции у наследников. class CMain { public: virtual void...

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

Отрабатывает оператор базового, а не производного класса - C++
Здравствуйте! Собственно, вопрос в следующем. Я перегрузил оператор потокового вывода для базового и для производного класса. При выводе...

8
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
04.02.2013, 15:01 #2
Только если убрать virtual и через указатель на A. Возможно есть и другие способы
0
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
04.02.2013, 15:16 #3
Цитата Сообщение от Hugo_Boss Посмотреть сообщение
operator @
это что за оператор?

И где тут базовый класс?
0
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
04.02.2013, 15:25 #4
Цитата Сообщение от Schizorb Посмотреть сообщение
это что за оператор?

И где тут базовый класс?
Предполагаю что под operator @ ТС имел ввиду любой оператор, который можно перегрузить. Также, судя по коду и вопросу ТС в качестве базового имеет класс A, но забыл это указать.
0
Hugo_Boss
1 / 1 / 0
Регистрация: 29.01.2013
Сообщений: 46
04.02.2013, 16:06  [ТС] #5
Блин, да, ступил - торопился сюда написать. Вот структура:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A {
  A();
  ~A();
  virtual void operator @ (const char* s) {}
};
 
//этот класс использует оператор @ базового класса
class B : public A {
  B();
  ~B();
};
 
class C : public A {
  C();
  ~C();
  virtual void operator @(const char* s) {
    //ряд дополнительных действий
    //здесь хочу вызвать оператор @ базового класса
  }
};
Извините.

Добавлено через 56 секунд
Цитата Сообщение от Пёс Посмотреть сообщение
Только если убрать virtual и через указатель на A.
Можно, пожалуйста, чуть поподробнее?
0
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
04.02.2013, 16:10 #6
А может вызвать явно, указав облать видимости?
0
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
04.02.2013, 16:19 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A {
  A();
  ~A();
  void operator @ (const char* s) {}                      //убираете virtual
};
 
//этот класс использует оператор @ базового класса
class B : public A {
  B();
  ~B();
};
 
class C : public A {
  C();
  ~C();                                                              
  void operator @(const char* s) {                         //здесь тоже
    //ряд дополнительных действий
    //здесь хочу вызвать оператор @ базового класса
    A* pointerA = this;                    //создаём указатель на базовый класс, и помещаем туда адрес объекта класса C
    pointerA->operator @();             //вызываем operator @, который принадлежит базовому классу. (если бы стоял virtual, то вызвался оператор наследника)
  }
Добавлено через 4 минуты
Кстати!!! Вспомнил ещё кое что!

если не ошибаюсь, то сработает такая запись:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A {
  A();
  ~A();
  virtual void operator @ (const char* s) {}
};
 
//этот класс использует оператор @ базового класса
class B : public A {
  B();
  ~B();
};
 
class C : public A {
  C();
  ~C();
  virtual void operator @(const char* s) {
    //ряд дополнительных действий
    //здесь хочу вызвать оператор @ базового класса
    this->A::operator @(s);
  }
};
0
Hugo_Boss
1 / 1 / 0
Регистрация: 29.01.2013
Сообщений: 46
04.02.2013, 16:27  [ТС] #8
Пёс, Спасибо! Я в этом же направлении думал (1 вариант). Про 2ой знал, но у меня не проходило, потому и написал сюда на форум. Сейчас вроде получилось, хотя ничего не менял. Как всегда, мистика )))
Хотел тебе плюсануть, но что-то не нашел кнопочки нужной.
0
silent_1991
Эксперт С++
5005 / 3063 / 149
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
04.02.2013, 16:39 #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
#include <iostream>
 
class A
{
public:
    A()
    {
    }
    
    virtual ~A()
    {
    }
    
    virtual void operator+(const char* s)
    {
        std::cout << "A::operator+(" << s << ")" << std::endl;
    }
};
 
//этот класс использует оператор @ базового класса
class B : public A
{
public:
    B()
    {
    }
    
    virtual ~B()
    {
    }
};
 
class C : public A
{
public:
    C()
    {
    }
    
    virtual ~C()
    {
    }
    
    virtual void operator+(const char* s)
    {
        std::cout << "C::operator+(" << s << ")" << std::endl;
        
        A::operator+(s);
    }
};
 
int main()
{
    A *a1 = new A();
    A *a2 = new B();
    A *a3 = new C();
    
    *a1 + "hello";
    std::cout << "--------------------" << std::endl;
    *a2 + "hello";
    std::cout << "--------------------" << std::endl;
    *a3 + "hello";
    
    delete a1;
    delete a2;
    delete a3;
    
    return 0;
}
http://liveworkspace.org/code/LoqS$6
1
04.02.2013, 16:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2013, 16:39
Привет! Вот еще темы с ответами:

Вызвать функцию базового класса с ссылочным квалификатором && - C++
struct A { std::vector&lt;int&gt; data; virtual std::vector&lt;int&gt;&amp; foo() &amp; { puts(__PRETTY_FUNCTION__); ...

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса? - C++
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе, (напр., получив такой базовый объект...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...

C++ Элемент класса в наследнике - C++
Здравствуйте, нужна помощь. Как использовать элемент класса в наследнике? Выдаёт ошибки &quot; 'int One::a' is protected&quot; и &quot;within this...


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

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

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