Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Metody wirtualne

Ostatnio zmodyfikowano 2017-11-03 13:19
Autor Wiadomość
rav89lodz
Temat założony przez niniejszego użytkownika
Metody wirtualne
» 2017-11-03 12:31:17
Dzień dobry, napisałem program w trzech plikach

main.cpp

C/C++
#include <iostream>
#include"Polimorfizm.h"

using namespace std;

void obliczenia( Ksztalt * x ) // Funkcja ktora jako argument dostaje wskaznik wirtualny
{
    x->oblicz_pole(); // Funkcja wywoluje inna funkcje (musi byc ona publiczna)
}

int main()
{
    Kolo k1; // Zadzala konstruktor domniemany z pliku .h
    Kwadrat kw1( 2 ); // Zadziala jawne wywolanie konstruktora z pliku .cpp
   
    Ksztalt * wsk; // Wskaznik wirtualny
   
    wsk = & k1;
    wsk->oblicz_pole(); // Wskaznik wirtualny wywoluje funkcje
   
    wsk = & kw1;
    wsk->oblicz_pole();
   
    obliczenia( wsk ); // Wywolanie funkcji z pliku main
    wsk = & k1;
    obliczenia( wsk );
   
    return 0;
}

Polimorfizm.cpp

C/C++
#include <iostream>
#include"Polimorfizm.h"

using namespace std;

Kolo::Kolo( float x ) // Kosntruktor klasy Kolo
{
    r = x;
}

void Kolo::oblicz_pole()
{
    cout << "Pole kola: " << 3.14 * r * r << endl;
}

Kwadrat::Kwadrat( float x ) // Kosntruktor klasy Kwadrat
{
    a = x;
}

void Kwadrat::oblicz_pole()
{
    cout << "Pole kwadratu: " << a * a << endl;
}

Polimorfizm.h

C/C++
#include <iostream>

using namespace std;

class Ksztalt
{
public:
    virtual void oblicz_pole() = 0; // czysta funkcja wirtualna
};

class Kolo
    : public Ksztalt // Dziedziczenie publiczne od klasy Ksztalt
{
    float r;
public:
    Kolo( float = 1 );
    virtual void oblicz_pole();
};

class Kwadrat
    : public Ksztalt // Dziedziczenie publiczne od klasy Ksztalt
{
    float a;
public:
    Kwadrat( float = 1 );
    virtual void oblicz_pole();
};


Dlaczego w pliku Polimorfizm.cpp nie mogę się odnieść do funkcji oblicz_pole jako virtual void? Działa jedynie samo void a jako bład dostaje outside class declaration. Dlaczego samo void jest legalne a virtual void juz nie?
P-166398
Chowan
» 2017-11-03 13:19:51
cytując wikipiedie
"Słowo kluczowe virtual określa się tylko w deklaracji metody, nie określa się tego w definicji (chyba że deklaracja jest jednocześnie definicją, co ma miejsce gdy implementacja metody zostanie określona w ciele klasy)."
P-166400
« 1 »
  Strona 1 z 1