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

Наследование, и перегрузки методов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа со строками в с++.Преобразование строки. http://www.cyberforum.ru/cpp-beginners/thread399065.html
Дана строка, слова в которой состоят из букв латинского алфавита и десятичных цифр. Остальные символы считаются разделителями между словами. Получить новую строку, выполняя в заданной строке замены по следующим правилам: – все слова, имеющие длину менее 7 символов и состоящие только из цифр, заменяются словами, записанными в обратном порядке; – во всех словах, в которых встречаются как...
C++ Прототип функции Записать прототип функции, которая осуществляет перевод десятичного числа в двоичную систему. #include <stdio.h> #include <conio.h> #include <stdlib.h> int main() { long N; char a; printf("\nVvedite polozhitel'noe chislo: "); http://www.cyberforum.ru/cpp-beginners/thread399051.html
Windows.h C++
Скажите как создать проект в Visual studio что бы программировать в среде windows, т.е работать с библиотекой Windows.h
C++ игра через класс на С++
помогите пожалуйста написать игру(любую)на С++ через классы. спасибо заранее)
C++ Генерация случайных чисел с использованием srand и библиотеки time может выдавать одинаковые числа, если... http://www.cyberforum.ru/cpp-beginners/thread399041.html
... если интервал случайных чисел, из которых идет отбор больше требуемого кол-ва случайных чисел? Например: есть интервал (0-2000), из него требуется случайно получить 1000 значений. Будет ли получена хотя бы одна пара одинаковых значений? P.S. Имхо, но вопрос и ответ возможно достойны F.A.Q. Спасибо!
C++ найти сумму если ,где x1=-100,3;xi=x(i-1)+deltax;deltax=3,1 и там эти (i-1,(i+1) и т.п. они должны быть в правом нижнем углу икса,просто у меня не вишло ...) подробнее

Показать сообщение отдельно
Bers
Заблокирован
05.12.2011, 02:51     Наследование, и перегрузки методов
Вопрос: есть ли какие нибудь красивые решения данной проблемы?

Рассмотрим ниже представленный код:
C++
1
2
3
4
5
6
7
8
9
class Test1
{
    public: void Print(const char* text) { std::cout<<text; }
};
 
class Test2:public Test1
{
    public: void Print(const Test2& rhs) { std::cout<<"text\n"; }
};
Я рассчитываю, что Test2 унаследует весь функционал Test1
И я смогу им свободно пользоваться. Но это не совсем так...
C++
1
2
3
4
5
6
7
8
9
int main()
{
    Test2 t;
    t.Print(t);     //можно
    
    t.Print("sdf"); //error C2664: Test2::Print: 
                    //невозможно преобразовать параметр
                    //1 из 'const char [4]' в 'const Test2 &'
}
Все дело в том, что если в наследнике имеется одноименный метод, то он скрывает собой все перегрузки базового метода.
Теперь, снаружи методы базового класса в обычном виде уже не доступны.

Можно вылечить двумя способами. Оба способа на мой взгляд, ну по меньше мере не красивы.

C++
1
2
3
4
5
6
7
8
//первый способ:
int main()
{
    Test2 t;
    t.Print(t);     //можно
    
    t.Test1::Print("sdf"); //можно
}
Помимо ужасной на вид записи, такой способ имеет более серьёзные недостатки.
Например, вынуждает пользователя знать внутреннее устройство класса (знать, от чего он там унаследовался). И серьёзно затрудняет проектирование архитектуры на шаблонах.
Приходится повсюду таскать за собой "знание о типе, от которого был унаследован класс", и постоянно контролировать какие методы "дополниловки", а какие - "наследство от папочки".


Второй способ сводит на нет надобность в самом наследовании (хотя, мне он видится более предпочтительным в такой ситуации)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Test1
{
public: void Print(const char* text) { std::cout<<text; }
};
 
class Test2:public Test1
{
public: void Print(const Test2& rhs) { std::cout<<"text\n"; }
        void Print(const char* text) { Test1::Print(text); }
};
 
int main()
{
    Test2 t;
    t.Print(t);     //можно
    
    t.Print("sdf"); //теперь можно
}
Помимо того, что приходится дублировать код, данный способ ещё пахнет оверхедом.
То есть,функция запускает функцию. Может быть компилятор это оптимизирует. А может быть и нет.


Вопрос: есть ли какие нибудь красивые решения данной проблемы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 22:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru