Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Kantaluokka saavuttamaton (inaccessible)

Oskuz [11.02.2014 19:59:32]

#

Seuraava koodi aiheuttaa virhe ilmoituksen "27[Error]'esine' is an inaccessible base of 'laatikko'", sen verran ymmärsin enkkua että se aiheutuu vectorista, mutten että mistä se johtuu?

#include <iostream>
#include <vector>
class esine{
	float paino;
	public:
		esine(float paino1):paino(paino1){
		}
	float ret_paino(){ return paino;
	}
	~esine(){
	}
};

class laatikko: esine{
	float tilavuus;
	public:
		laatikko(float tilavuus1,float paino1):esine(paino1),tilavuus(tilavuus1){
		}
		~laatikko(){
		}
		float tiheys(){ return (ret_paino()/tilavuus);
		}
};

int main(){
	std::vector<esine>esineet;
	esineet.push_back(laatikko(5.2,4));
	esineet.push_back(laatikko(0.5,4));
	for(unsigned i=0;i<esineet.size();i++){
		std::cout<<"laatikon tiheys: ";
		std::cout<<esineet[i]::tiheys()<<std::endl;
	}
	esineet.clear();
}

jlaire [11.02.2014 20:23:30]

#

class laatikko: esine{

Luokan perintä on oletuksena private.

class laatikko: public esine{

Metabolix [11.02.2014 20:26:49]

#

Koodissasi on kaksi virhettä.

Olet määritellyt, että esine on laatikko-luokan yksityinen kantaluokka. Näin on, koska käytät sanaa class ja et ole erikseen käyttänyt sanaa protected tai public. Tämän myötä tieto siitä, että laatikko on esine, on private eli yksityinen eli ulkopuolisille näkymätön. Siksi et voi käyttää laatikko-tyyppistä oliota tilanteessa, jossa pitäisi olla esine. Tästä saat virheilmoituksen. Virheilmoitus ei liity vektoriin, vaan saisit ihan saman ilmoituksen myös näin:

esine e(0);
e = laatikko(1, 2);

Olet määritellyt, että esineet-vektori sisältää esine-tyyppisiä olioita. Vektorissa on tilaa vain esine-luokan sisältämille tiedoille (float paino). Silloin et voi laittaa vektoriin laatikko-tyyppistä oliota, koska laatikko ei ole pelkästään esine. Jos yrität laittaa laatikon tuohon vektoriin, tuloksena on uusi esine, jolla on sama paino kuin laatikolla mutta joka ei enää ole laatikko vaan pelkkä esine. Ihan sama tapahtuu tässäkin:

esine e(0);
e = laatikko(1, 2); // e = esine(2), ja laatikko katoaa.

Jos haluat vektoriin erilaisia esineitä, sinun pitää käyttää osoittimia ja käytännössä myös tehdä luokista virtuaalisia (tai lisätä kantaluokkaan jäsen, jossa kerrotaan, mikä luokka oikeasti on kyseessä). Näistä asioista kerrotaan tämän sivuston C++-oppaissa, kannattaa lukea.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta