#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
class figura{
protected:
string nombre;
int lados;
public:
virtual int area();
};
class cuadrado:public figura{
public:
cuadrado(){
lados=4;
}
virtual int area(){
return lados*lados;
}
};
class triangulo:public figura{
int a,b;
public:
triangulo(){
lados=3;
}
void pedir(){
cout<<"Base: "<<endl;
cin>>b;
cout<<"Altura: "<<endl;
cin>>a;
}
virtual int area(){
return ((b*a)/(2));
}
};
main(){
int op;
int *punt;
int v;
cout<<"FIGURAS"<<endl;
cout<<"1. Cuadrado\n2. Triangulo"<<endl;
cin>>op;
if(op==1){
cuadrado ob1;
v=ob1.area();
punt=&v;
}
else{
triangulo ob1;
ob1.pedir();
ob1.area();
}
system("pause");
}
Твоя проблема estГЎ aquГ-:
class figura {
...
public:
virtual int area( );
};
Ты Заявляешь твой funciГіn-член как virtual
, но у тебя нет тело ее funciГіn, ты ни объявил как виртуальные чистые .
у составителя, когда находит одну funciГіn-член virtual
, есть свобода, чтобы осуществлять в Ваш вкус ; она mayorГ - в (из-за того, что они не говорят все) они используют mecanimo, VPTR + VTABLE .
Давайте Говорить, что состоит из aГ±adir указатель скрытые в твой класс, который содержит ее direcciГіn виртуальных функций той же самой; serГ - во что-то asГ-:
// El compilador general algo como esto
class figura;
struct figuraVTABLE {
int ( *area )( figura *this );
};
class figura {
struct figuraVTABLE *VPTR;
...
// Las cosas reales de tu clase ...
...
};
Это механизм скрытые и прозрачные для tГ-; не необходимо, чтобы ты обработал информацию с этим. Составитель берется за это без того, чтобы tГє у тебя не было даже, что знать это.
AdemГЎs предыдущего, C ++ работает с единицами traducciГіn индивида: estГЎ позволенный объявлять вещи в файле и осуществлять в другом. Это мотив существования файлов заголовка , и, что она generaciГіn выполнимого осуществился в 2 шагах: compilaciГіn + , соединенные .
Вї Проблема всего этого? Так как, которые ты можешь признавать вещами в сайте, и забывать давать им стоимость..., что то, что ты estГЎ происходя.
, Когда funciГіn-член заявляет как virtual
, составитель aГ±ade переменная в твой класс, но он не распределяет ему ningГєn стоимость ; это редактор связей, который берется за это. И уже мы знаем, что эта стоимость может быть в другой единица traducciГіn .
Это твоя проблема: VPTR
твоего класса он не соответствует ни одной VTABLE
.
у Тебя Есть 2 решения:
Объявляет твой funciГіn-член как чистые :
class figura {
...
public:
virtual int area( ) = 0; // <- AQUÍ
};
С этим, уже estГЎs инициализируя ты VPTR
. Ты сообщаешь, что эта у funciГіn-члена нет тела . Твой класс переходит к тому, чтобы быть абстрактными , с которым ты не можешь объявлять изменчивые инстанции этого класса:
figura mifigura1; // <-- ERROR.
Осуществляет твой funciГіn-член; помести ему тело . Это может делаться в отдельном файле, и что потом редактор связей взялся:
// firgura.cpp
int figura::area( ) {
...
}
Или ты можешь делать все в том же файле:
class figura {
...
public:
virtual int area( ) {
...
}
};
Замечает : это объявляет твой funciГіn-член как inline
, что отдельная история..., но уже мы распространяемся слишком много.
В твоем конкретном случае, я думаю, что она soluciГіn, который ты ищешь, является 1
: превращать твой класс в абстрактный класс .
Замечает : Твоя проблема - одна variaciГіn SГ-mbolo приходящий ученик, не решая. Вї QuГ© я повредил?
Вся твоя проблема может сводиться к следующему cГіdigo:
struct B
{
virtual void f();
};
struct D : B
{};
int main()
{
D{}.f();
return 0;
}
Полная ошибка serГ - в:
undefined reference to `B::f()' In function `B::B()': undefined reference to `vtable for B' undefined reference to `B::f()'
ясный и автообъяснительный, но я это перевожу для того, чтобы он это был aГєn mГЎs:
referencia a `B::f()' no definida En la función `B::B()': referencia a `vtable for B' no definida referencia a `B::f()' no definida
Ошибка сказал нам три раза что она funciГіn f
из B
не estГЎ определенная, и верно, estГЎ sГіlo объявленная, asГ - что для того, чтобы ошибка исчезла, ты должен определять ее funciГіn area
из figura
:
class figura {
protected:
string nombre;
int lados;
public:
virtual int area() { return {}; }
};
, Но ввиду того, что каждая из производных фигур они идут в sobrescribir она funciГіn area
, он не имеет смысл, что Г©sta у него был definiciГіn, podrГ-туз избегать определять haciГ©ndola виртуальные чистые :
class figura {
protected:
string nombre;
int lados;
public:
virtual int area() = 0;
};
Эта soluciГіn, ademГЎs имения преимущества в том, чтобы не писать cГіdigo, что он не имеет смысл, что он был написан, вынуждает тебя определять ее funciГіn в производных классах и вызывает ошибку compilaciГіn в случае, если ты это забудет быть сделанным.