Re: Question about inaccessible bases [long].
On 7 Sep, 08:05, Ryan McCoskrie <ryan.mccosk...@invalid.invalid>
wrote:
Can somebody tell me exactly why one class is an inaccessible
base to another and exactly what this means?
I'm working on a virtual machine that implements its devices
as C++ classes.
The problem is though that g++ spits out the function that
puts the virtual disk and the terminal in place, saying:
device_t is an inaccessible base of 'storage_dev'.
The odd thing is that the file where I have implemented all of
storage_dev's functions has no such trouble.
The superclass to all of the devices:
class device_t {
public:
virtual short act(short, short, short);
};
The storage_dev class:
class storage_dev : device_t {
class storage_dev : public device_t // logically correct (since
act is public in storage_dev) and all your problems go away!
public:
storage_dev(char*);
short act(short op, short arg1, short arg2);
~storage_dev();
private:
short set_position(short position);
short read(short number, short buffer);
short write(short number, short buffer);
FILE *storage;
};
The function in question:
//these are all defined in main.cpp
extern short RAM[65536];
extern short CDEV;
extern vector<device_t*> devices;
void setup(char *fName){
CDEV = 0; //current device
//open up fName as a virtual hard disk
//This is the line where it goes wrong
devices.push_back( new storage_dev(fName) );
From this function's point of view storage_dev* is not convertible to
device_t* because storage_dev is not a device_t as far as "the public"
are concerned.
This would only compile if setup were a member of storage_dev or you
use public inheritance.
//load the boot loader into RAM
devices[0]->act(0,0,0); //Place position at the beggining of the stream
devices[0]->act(1, 512, 0); //read 512 bytes directly into RAM
//create a terminal
devices.push_back( new terminal_dev );
}
Extra tips:
Use const char* rather than char* (or better yet std::string).
Don't use short as an argument type even if positions are held as
short because it wont normally help performance and will make it
harder to spot truncation bugs. This is because int will be silently
chopped to short (compiler will generally warn for constants but not
variables or expressions) whereas if you pass int you can assert
( (short)arg == arg ).
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]