Egy subclass virtual függvény hívása (C++)
2013-10-19T11:42:41+02:00
2013-10-19T14:48:47+02:00
2022-08-08T07:20:32+02:00
WarmUp
Az alábbi absztrakt test osztályban szeretnék egy suly nevű függvényt, amely a baseclass suruseg nevű adattagját szorozná meg a származtatott osztály terfogat()-ával. A terfogat most pure virtual.

class test { public: int suruseg; test(); test(int suruseg); virtual double terfogat() = 0; double suly(); }; double test::suly() { return suruseg*terfogat(); }

A fordító hibaüzenete alapján úgy tűnik, hogy nem érhetem el a származtatott osztály függvényeit.

Megoldható, hogy egy ilyen jellegű függvényt a baseclass-ban implementáljak ?
Mutasd a teljes hozzászólást!
private inheritance a default class-ok esetén!

public fgv -> private fgv lesz, így nem lesz elérhető a gomb/kocka osztályon kívülől..

class gomb : public test {

Még mindig egy könyvet tudok javasolni, mert amúgy még nagyon sokat fogsz idejárni :D


inheritance
Mutasd a teljes hozzászólást!

  • Ez így működik, amit leírtál, csak példányosítani nem lehet ezt az osztályt önállóan, mert van egy pure virtual függvénye. Ha leszármazol belőle és implementálod a pure virtual függvényt, akkor a leszármazottat már lehet példányosítani.
    Mutasd a teljes hozzászólást!
  • Egy alap C++ könyvet javaslok!
    Azon gyorsan átrohansz és világos(abb) lesz minden
    Mutasd a teljes hozzászólást!
  • Összeraktam egy darabba és így is ugyanazok a hibák.


    #include <iostream> using namespace std; class test { public: int suruseg; test() : suruseg(1) {}; test(int suruseg) : suruseg(suruseg) {}; virtual double terfogat(); double suly() { return suruseg*terfogat();}; }; class kocka : test { public: int el; kocka(): el(1) {}; kocka(int) : el(el) {}; double terfogat() { return el*el*el;}; }; class gomb : test { public: int r; gomb(): r(1) {}; gomb(int) : r(r) {}; double terfogat() { return r*r*r*4*3.14/3; }; }; int main() { gomb g(1); kocka k(1); cout << "Hello world!" << endl; cout << "gomb sulya: " << g.suly() << endl; cout << "kocka sulya: " << k.suly() << endl; return 0; }


    Ezt látom a fordításkor.

    D:\devel\c++\virtualone\main.cpp: In function 'int main()':
    D:\devel\c++\virtualone\main.cpp:10:12: error: 'double test::suly()' is inaccessible
    D:\devel\c++\virtualone\main.cpp:35:38: error: within this context
    D:\devel\c++\virtualone\main.cpp:35:38: error: 'test' is not an accessible base of 'gomb'
    D:\devel\c++\virtualone\main.cpp:10:12: error: 'double test::suly()' is inaccessible
    D:\devel\c++\virtualone\main.cpp:36:39: error: within this context
    D:\devel\c++\virtualone\main.cpp:36:39: error: 'test' is not an accessible base of 'kocka'
    Mutasd a teljes hozzászólást!
  • private inheritance a default class-ok esetén!

    public fgv -> private fgv lesz, így nem lesz elérhető a gomb/kocka osztályon kívülől..

    class gomb : public test {

    Még mindig egy könyvet tudok javasolni, mert amúgy még nagyon sokat fogsz idejárni :D


    inheritance
    Mutasd a teljes hozzászólást!
  • Szevasz!

    Alapból egy "class X : Y" esetén az Y public függvényei az X-en belül már private-ek lesznek, ezért mondja az a fordító, hogy nem érhető el a suly() a main()-ben. Próbáld meg így:
    class kocka : public test
    class gomb : public test

    Üdv,
    Dave

    Mutasd a teljes hozzászólást!
  • Köszi!

    Most éppen a könyvet olvasom át és próbálom a nem világos részeket.

    Így már jó lett:
    #include <iostream> using namespace std; class test { public: double suruseg; test() : suruseg(1.1) {}; virtual double terfogat() = 0; double suly() { return suruseg*terfogat();}; }; class kocka : public test { public: double el; kocka() : el(1.0) {}; kocka(double el) : el(el) { }; double terfogat() { return el*el*el;}; }; int main() { kocka k(2.0); cout << "kocka terfogata: " << k.terfogat() << endl; cout << "kocka sulya: " << k.suly() << endl; return 0; }
    Mutasd a teljes hozzászólást!
  • float-ot használnék, ha nem fontos a nagy pontosság!

    Kevesebb memória és lassabb biztos nem lesz tőle a kód, viszont lehet hogy gyorsabb..
    Mutasd a teljes hozzászólást!
abcd