简体   繁体   中英

c++ Using subclasses

I have this variable; Furniture **furnitures; Which is an abstract baseclass to 2 subclasses, Bookcase and Couch. I add these randomly;

furnitures[n++] = new Bookcase ();
furnitures[n++] = new Couch();
.
.

For the sake of explaination. Lets set some minor variables. Furniture private: name, prize Bookcase private: size Couch private: seats

How would I go about if I wanted to print out information such as; name and seats?

There are various of problems in this issue. 1, distinguish which subclass is which when I use Furniture[i]. 2, I dont want to blend too much unneccessary functions between the two subclasses that arent needed.

class Furniture 
{
    virtual void output() = 0;
};

class Couch : public Furniture
{
    void output() override;
};

class Bookshelf : public Furniture
{
    void output() override;
};

You could define the function in Furniture to save from duplicate code in subclasses like this:

void Furniture::output()
{
    // We assume here the output is to cout, but you could also pass the necessary
    // stream in as argument to output() for example.
    cout << name << price;
}

void Couch::output()
{
    Furniture::output();
    cout << seats;
}

void Bookshelf::output()
{
    Furniture::output();
    cout << size;
}

You should never use arrays polymorhphically . Read the first item (I think it's the first) in Scott Meyers' More Effective C++ book to find out why!

In fact, you should almost never use raw arrays in C++ anyway. A correct solution is to use a std::vector<Furniture*> .

How would I go about if I wanted to print out information such as; name and seats?

There are various of problems in this issue. 1, distinguish which subclass is which when I use Furniture[i]. 2, I dont want to blend too much unneccessary functions between the two subclasses that arent needed..

You are facing this problem because you are abusing object-oriented programming. It's simple: object-oriented programming makes sense when different types implement an abstract common operation and the concrete type is chosen at run-time. In your case, there is no common operation. Printing (or receiving) the number seats is for one type, printing (or receiving) a size is for the other type.

That's not to say that it's bad or wrong, but it's simply not object-oriented.

Now C++ would not be C++ if it didn't offer you a dangerous tool to get out of every dead end you've coded yourself into. In this case, you can use Run-Time Type Identifcation (RTTI) to find out the concrete type of an object. Google for typeid and dynamic_cast and you'll quickly find the solution. But remember, using RTTI for this problem is a workaround . Review your class design, and change it if necessary.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM