Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
1

Реализация двух виртуальных методов с одинаковыми именами при множественном наследовании

13.05.2016, 22:41. Показов 4537. Ответов 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
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
class A{
public:
    virtual void foo() = 0;
};
class B{
public:
    virtual void foo() = 0;
};
class C : public A, public B{
public:
    void A::foo(){
        cout<<"foo from A"<<endl;
    }
    void B::foo(){
        cout<<"foo from B"<<endl;
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    C c;
    C *cPtr;
    cPtr = &c;
    cPtr->A::foo(); //если закоментить - работает
    cPtr->B::foo(); //если закоментить - работает
    system("pause");
    return 0;
}
Что я получаю при компиляции:
error LNK2019: unresolved external symbol "public: virtual void __thiscall B::foo(void)" (?foo@B@@UAEXXZ) referenced in function _wmain G:\Dropbox\--\test.obj test
error LNK2019: unresolved external symbol "public: virtual void __thiscall A::foo(void)" (?foo@A@@UAEXXZ) referenced in function _wmain G:\Dropbox\--\test.obj test
error LNK1120: 2 unresolved externals G:\Dropbox\--\test.exe test

Так вот, то что я хочу, вообще возможно?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2016, 22:41
Ответы с готовыми решениями:

Создание нескольких методов с одинаковыми именами
Есть класс Rectrangle, в котором я хочу сделать несколько способов его прорисовки, то бишь...

Вызов методов с одинаковыми именами для разных классов
В функцию func можно передать один из двух классов A или B. У них есть функции с одинаковыми...

Конструктор при множественном наследовании
#include &lt;string&gt; class Worker // an abstract base class { private: std::string...

Инициализация при множественном наследовании
Имеется иерархия типов. Во главе: базовый класс-интерфейс, далее один базовый класс, от него два...

3
Модератор
Эксперт С++
11301 / 9286 / 5570
Регистрация: 18.12.2011
Сообщений: 24,782
14.05.2016, 10:12 2
Лучший ответ Сообщение было отмечено Александр_Алекс как решение

Решение

Мне кажется, Вы не совсем понимаете концепцию виртуальности.
В абстрактном классе только указано, что производные классы будут иметь такие-то методы.
То, что в обоих классах указан одинаковый метод, совсем не значит, что в производном классе их должно быть два. Просто в этом случае, как по указателю на первый базовый класс, так и по указателю на второй базовый класс будет вызываться один и тот же метод производного класса.
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
#include <iostream>
using namespace std;
 
class A{
public:
    virtual void foo() = 0;
};
class B{
public:
    virtual void foo() = 0;
};
class C : public A, public B{
public:
    void foo(){
        cout<<"foo from C"<<endl;
    }
};
int main()
{
    C c;
    A *pa=&c;
    pa->foo();
    B* pb=&c;
    pb->foo();
    system("pause");
    return 0;
}
1
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
14.05.2016, 10:44  [ТС] 3
Цитата Сообщение от zss Посмотреть сообщение
То, что в обоих классах указан одинаковый метод, совсем не значит, что в производном классе их должно быть два.
Это я, к счастью, понимаю. Просто экспериментировал, компилятор позволил мне создать две разных реализации, теперь мне интересно, можно ли как-то использовать то что я там понаписал

Добавлено через 7 минут
Тем более, я же могу сделать так:
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
class A{
public:
    void foo(){
        cout<<"foo from A"<<endl;
    }
};
class B{
public:
    void foo(){
        cout<<"foo from B"<<endl;
    };
};
class C : public A, public B{
 
};
int _tmain(int argc, _TCHAR* argv[])
{
    C c;
    C *cPtr;
    cPtr = &c;
    cPtr->A::foo();
    cPtr->B::foo();
    system("pause");
    return 0;
}


Думал, что можно реализацию в наследнике расписать и сделать также
0
Модератор
Эксперт С++
11301 / 9286 / 5570
Регистрация: 18.12.2011
Сообщений: 24,782
14.05.2016, 12:50 4
В этом случае у Вас существуют ДВЕ функции, одна в классе A, другая - в классе B
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.05.2016, 12:50

Неоднозначность при множественном наследовании
Привет всем, столкнулся с проблемой при множественном наследовании классов. Надеюсь, кто-нибудь...

При множественном наследовании компилятор ругается
код хедера такой : #include &quot;pch.h&quot; #include &quot;rb_collection.h&quot; #include &quot;abstractutil.h&quot; ...

Конструкторы с параметрами при множественном наследовании
у меня есть класс, quotes который является базовым для двух классов moving_average и rsi...

Метод super при множественном наследовании
Как обращаться к методам класса родителя при множественном наследовании?


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

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

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