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

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

10.02.2015, 21:32. Показов 1525. Ответов 5
Метки нет (Все метки)

Здравствуйте!
Есть три класса, абстрактный CGraphicsObject, и два его наследника Circle и Parallelogram
В CGraphicsObject содержится прототип виртуальной функции show, которую я хочу реализовать в классах-наследниках.
Реализовал в Circle, запустил -- все работает. Описываю в Parallelogram, компилирую, выдает такие ошибки:

parallelogram.obj : error LNK2005: "public: virtual void __thiscall CGraphicsObject::show(void)" (?show@CGraphicsObject@@UAEXXZ) уже определен в Circle.obj

1>F:\Dropbox\unversity\ООП 2 курс, 2 четв\Lab4\Debug\Lab4.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более

Вот код:

Интерфейс CGraphicsObject
C++
1
2
3
4
5
6
7
8
#pragma once
class CGraphicsObject
{
public:
    virtual void show();
    CGraphicsObject();
    ~CGraphicsObject();
};
Интерфейс parallelogram
C++
1
2
3
4
5
6
7
8
#include "graphicsobject.h"
class parallelogram :
    public CGraphicsObject
{
public:
    parallelogram();
    ~parallelogram();
};
Реализация parallelogram
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "StdAfx.h"
#include "parallelogram.h"
#include "iostream"
 
using namespace std;
 
//реализация show мeтода
void CGraphicsObject::show(){
    cout<<"Создан объект класса parallelogram"<<endl;
    cout<<"Унаследовано от CGraphicsObject"<<endl;
    cout<<"Наследников нет."<<endl;
}
 
parallelogram::parallelogram(void)
{
}
 
 
parallelogram::~parallelogram(void)
{
}
Интерфейс Circle

C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
#include "graphicsobject.h"
class Circle :
    public CGraphicsObject
{
public:
    double radius;
    void setRadius(double &radius);
    double getArea(double radius);
    Circle();
    ~Circle();
};
Реализация Circle

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 "Circle.h"
#include "iostream"
 
using namespace std;
 
//реализация set мeтода
void Circle::setRadius(double &radius){
    cin>>radius;
}
//реализация get мeтода
double Circle::getArea(double radius){
    return 3,14*radius*radius;
}
//реализация show мeтода
void CGraphicsObject::show(){
    cout<<"Работа ведется с классом Circle"<<endl;
    cout<<"Унаследовано от CGraphicsObject"<<endl;
    cout<<"Наследников нет."<<endl;
}
 
Circle::Circle()
{
    show();
}
 
 
Circle::~Circle()
{
}
Файл с main функцией

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Lab4.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "iostream"
//интерфейс
#include "Circle.h"
#include "parallelogram.h"
 
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale( LC_ALL,"Russian" );
 
    Circle circelObj;
    parallelogram parallObj;
    system("pause");
    return 0;
}
Так вот вопрос, в чем же ошибка? Почему я не могу реализовать метод в двух классах сразу?
Если что, пишу код в MS VS 2010
Заранее спасибо!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2015, 21:32
Ответы с готовыми решениями:

Массивы в классах-наследниках
Есть абстрактный базовый класс Base и два потомка D1 и D2. Я хочу, объявить в классе двумерный...

Как сделать поля приватными, но доступными в классах наследниках?
У меня есть код и name, age, food я хочу сделать приватным, но как надо написать, что бы не было...

Почему нет доступа к данным-членам классов-родителей в классах-наследниках?
#include&lt;string&gt; using namespace std; class base { int i; public: base(int x) { i = x; }...

переопределение виртуального метода
Существует родитель-класс TEditField = class(TObject) protected procedure...

5
Эксперт С++
8402 / 4078 / 891
Регистрация: 15.11.2014
Сообщений: 9,168
10.02.2015, 21:38 2
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
Так вот вопрос, в чем же ошибка?
в двух разных спп файлах реализован один и тот же метод:
C++
1
void CGraphicsObject::show()

обратите внимание на:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//реализация show мeтода
void CGraphicsObject::show(){
    cout<<"Создан объект класса parallelogram"<<endl;
    cout<<"Унаследовано от CGraphicsObject"<<endl;
    cout<<"Наследников нет."<<endl;
}
 
parallelogram::parallelogram(void)
{
}
 
 
parallelogram::~parallelogram(void)
{
}
Этот файл определяет реализацию наследника.
Почему тогда в нем фигурирует базовый класс?

Лекарство:

C++
1
2
3
4
5
6
//реализация show мeтода
void parallelogram::show(){
    cout<<"Создан объект класса parallelogram"<<endl;
    cout<<"Унаследовано от CGraphicsObject"<<endl;
    cout<<"Наследников нет."<<endl;
}
Разумеется, метод должен быть объявлен в классе наследника.
1
10 / 7 / 4
Регистрация: 08.12.2013
Сообщений: 165
10.02.2015, 22:05  [ТС] 3
Цитата Сообщение от hoggy Посмотреть сообщение
Этот файл определяет реализацию наследника.
Почему тогда в нем фигурирует базовый класс?
Лекарство:
Так реализую я метод описанный в интерфейсе класса CGraphicsObject, а не parallelogram.

В сёркл я так же реализовал, и все отлично
C++
1
void CGraphicsObject::show(){
А с лекарством что-то не получается
0
Миниатюры
Реализация виртуального метода в двух классах-наследниках  
Модератор
Эксперт С++
10874 / 8992 / 5409
Регистрация: 18.12.2011
Сообщений: 24,041
10.02.2015, 22:12 4
объявление
C++
1
void show();
нужно добавить во все классы.
И, соответственно для каждого класса их реализовать
C++
1
void Circle::show(){...
И, кстати, вызов виртуальных методов из main:
C++
1
2
3
4
5
6
7
Circle circelObj;
parallelogram parallObj;
CGraphicsObject* p;
p=&circelObj;
p->Show();
p=&parallObj;
p->Show();
1
DU
1492 / 1138 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
10.02.2015, 22:25 5
добавить во все классы означает:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "graphicsobject.h"
class parallelogram :
    public CGraphicsObject
{
public:
    parallelogram();
    ~parallelogram();
   
    // добавили
    virtual void show();
};
тогда лекарство должно подействовать.

отдельно, в базовом классе деструктор нужно сделать виртуальным.
1
Эксперт С++
8402 / 4078 / 891
Регистрация: 15.11.2014
Сообщений: 9,168
10.02.2015, 22:34 6
Цитата Сообщение от Александр_Алекс Посмотреть сообщение
Так реализую я метод описанный в интерфейсе класса CGraphicsObject, а не parallelogram.
Вам это сейчас сложно понять, однако функция член базового класса CGraphicsObject
не имеет никакого отношения к наследникам.

Ваша задача - переопределить эту функцию член в наследниках.
То бишь создать в наследниках точно такую же функцию, но со своим поведением.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2015, 22:34

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Переопределение виртуального метода
Нужно написать виртуальный метод в родительском классе , который находит площадь круга. Затем...

Вызов виртуального метода в конструкторе
Помню расматривался этот вопрос на форуме - хочу освежить память почему при вызове виртуального...

Ошибка создания виртуального метода?
Здравствуйте, хочу сделать так что бы программа(на андроид) рисовала по заданным координатам, но...

Реализовать перегрузку виртуального метода
В класе class1 реализован открытый виртуальный метод деление двух чисел &quot;a&quot; и &quot;b&quot;. Не внося...


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

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

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