c++ - 不同类的不可访问基面向对象编程c++

标签 c++ class c++11 inheritance virtual-inheritance

我一直在尝试编译这段代码。它有一个叫做 books 的类,其他类型的书籍继承自它。但是,当我编译程序时,它一直说 Book is an an accessible base of Police。然后它在主要的前两个 add_book 调用下显示红线,他们在其中添加了新的警察。 我没有看到我的代码中哪里缺少访问权限?

#include <iostream>
#include <vector>
#include <string>
using namespace std; 

class Book{
public: 
virtual double calc_price()const;
Book(string t, string a, int pg, bool bs)
: title(t), author(a), pages(pg), bestseller(bs){}
virtual ~Book(){}; 
virtual void display() const; 

protected: 
string title; 
string author; 
int pages; 
bool bestseller;      
}; 

void Book::display() const {
cout << "Title: " << title << endl;
cout << "Author: " << author << endl; 
cout << "Number of pages: " << pages << endl; 
cout << "Bestseller: "; if(bestseller==true){ cout << "Yep" 
<< endl; } else      {cout << "Nope" << endl; 
cout << "Price: " << calc_price() << endl; }
}

double Book::calc_price() const {    
if(bestseller==true){ return (pages*0.3 + 50); }
else { return (pages*0.3); }}



class Roman : public Book {
public: 
Roman(string t, string a, int pg, bool bs, bool bio)
: Book(t,a,pg,bs), biography(bio){}
virtual ~Roman(); 
virtual void display()const override; 
protected:
bool biography; 
}; 

void Roman::display() const{
Book::display(); 
cout << "Ce roman ";
if(biography==true){ cout << "is a biography. " << endl;
} else { cout << "isn't a biography. " << endl; }
}
class Police : Roman {
public: 
Police(string t, string a, int pg, bool bs, bool bio)
: Roman(t,a,pg,bs,bio){}
virtual double calc_price() const {
double price; 
price = Book::calc_price() - 10; 
if(price < 0) { return 1; } else { return price; }}
virtual~Police();
}; 

class Fantasy : public Livre {
public: 
Fantasy(string t, string a, int pg, bool bs)
: Book(t,a,pg,bs){}
virtual ~Fantasy();     
virtual double calc_price() const { 
return (Book::calc_price() + 30); }

}; 
class Library{
public: 
void display() const; 
void add_book(Book* l); 
void empty_stock(); 
private: 
vector<Book*> books; 
}; 

void Library::add_book(Book* b){
books.push_back(b);     
}
void Library::display() const {
 for(size_t i(0); i < books.size(); ++i){
    books[i]->display();     
} }

void Library::empty_stock(){
for(size_t i(0); i < books.size(); ++i){
    delete books[i]; } books.clear(); 
 }




int main()
{
 Library l;

l.add_book(new Police("Dogs of Baskerville", "A.C.Doyle", 221, false,false));
l.add_book(new Police("Le Parrain ", "A.Cuso", 367, true, false));
l.add_book(new Roman("Book3", "I. Calvino", 283, false, false));
l.add_book(new Roman ("Geronimoe memories", "S.M. Barrett", 173, false,  true));
l.add_book(new Fantasy ("European rivers", "C. Osborne", 150, false));

l.display();
l.empty_stock();

return 0;
}

最佳答案

更改 class Police : Romanclass Police : public Roman .

如果public未指定,Roman将是 private Police 的基类.

关于c++ - 不同类的不可访问基面向对象编程c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29656286/

相关文章:

c++ - 如何在 C++ 中合并多个排序范围?

ruby-on-rails - Ruby On Rails 中的类列表

c++ - 如何在不继承 A 类的情况下使 A 类成为 B 类的成员?

c++ - move 是否会使对象处于可用状态?

c++ - 宽松的内存顺序效果是否可以延长到执行线程的生命周期之后?

c++ - 在这个简单的例子中安全地调用 new 的最佳方法是什么?

c++ - 返回字符串流 (char*)

C++ STL vector 不接受复制构造函数

php - 在抽象类方法中返回抽象类的子类

c++ - 使用 std::copy 而不是手动 for 循环复制动态数组有什么好处?