纯虚函数(pure virtual), 是一个基类中的方法, 仅仅是声明, 而不包括定义, 是一个泛化概念(general concept);
是把相应的虚函数, 末尾添加"=0",该虚函数就变为纯虚函数, 可以不用添加定义;
如果是其他虚函数, 即使不使用, 也必须定义(define);
包含纯虚函数的基类, 是抽象基类(abstract base class),不能定义(define)对象(object), 仅可以作为继承使用;
代码:
/* * CppPrimer.cpp * * Created on: 2013.11.12 * Author: Caroline */ /*eclipse cdt*/ /*更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/*/ #include <iostream> #include <string> #include <cstddef> using namespace std; class Quote { public: Quote() = default; Quote (const std::string& book, double sales_price) : bookNo (book), price (sales_price) {} std::string isbn() const { return bookNo; } virtual double net_price (std::size_t n) const { return n* price; } //虚函数 virtual ~Quote() = default; //动态绑定析构器 private: std::string bookNo; protected: //受保护类型 double price = 0.0; }; class Disc_quote : public Quote { //抽象基类 public: Disc_quote() = default; Disc_quote (const std::string& book, double price, std::size_t qty, double disc) : Quote(book, price), quantity (qty), discount (disc) {} double net_price (std::size_t) const = 0; //纯虚函数 protected: std::size_t quantity = 0; double discount = 0.0; }; class Bulk_quote final : public Disc_quote { //final限定词, 无法被继承 public: Bulk_quote() = default; Bulk_quote(const std::string&book, double p, std::size_t qty, double disc) : Disc_quote(book, p, qty, disc) {} //使用基类的构造器 double net_price(std::size_t cnt) const override; }; double Bulk_quote::net_price(std::size_t cnt) const { if (cnt >= quantity) return cnt * (1-discount) * price; else return cnt * price; } double print_total(std::ostream &os, const Quote& item, std::size_t n) { double ret = item.net_price(n); os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << std::endl; return ret; } int main (void) { Quote q("CppPrimer", 99); Bulk_quote bq("CppPrimer", 99, 10, 0.5); Quote& rq = bq; std::size_t n = 20; std::cout << "We want to buy " << n << " books. " << std::endl; std::cout << "Quote net_price : " << q.net_price(n) << std::endl; std::cout << "Bulk_quote net_price : " << bq.net_price(n) << std::endl; std::cout << "R Quote net_price : " << rq.net_price(n) << std::endl; //动态绑定 Quote base("EffectiveCpp", 50); print_total(cout, base, 10); Bulk_quote derived("EffectiveCpp", 50, 5, .19); print_total(cout, derived, 10); //复制-赋值操作, 派生类->基类转换 base = derived; std::cout << "net_price : " << base.net_price(20) << std::endl; double undiscounted = derived.Quote::net_price(20); //派生类使用基类的虚函数 std::cout << "undiscounted : " << undiscounted << std::endl; return 0; }
作者:csdn博客 Spike_King
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索const
, double
, 径向基函数
, std
纯虚函数
纯虚函数和抽象类、抽象类 纯虚函数、abstract抽象类、抽象基类、c 抽象基类,以便于您获取更多的相关知识。
时间: 2024-12-21 22:24:37