C++中让子类对象继承父类对象全部数据的最简方法
问题
我想知道有没有办法让子类对象直接继承父类对象的全部数据,比如像下面这样写:
InventoryBook allBooks[20]; SoldBook child[0] = allBooks[0];
背景:我正在编写一个C++虚拟书店库存管理程序,需要实现处理销售交易的类,相关类定义如下:
class BookData { protected: char bookTitle[51] = {}, isbn[14] = {}, author[31] = {}, publisher[31] = {}, dateAdded[11] = {}; public: void setTitle(char newTitle[]); void setISBN(char newISBN[]); void setAuthor(char newAuthor[]); void setPub(char newPub[]); char *getTitle(); char *getISBN(); char *getAuthor(); char *getPub(); char *getDateAdded(); bool bookMatch(char[]); }; class InventoryBook : public BookData { protected: int qtyOnHand; double wholesale, retail; public: void setDateAdded(char newDate[]); void setQty(int newQty); void setWholesale(double newWhole); void setRetail(double newRetail); int isEmpty(); void removeBook(); void delBook(); int getQty(); double getWholesale(); double getRetail(); }; class SoldBook : public InventoryBook { private: const double taxRate = 0.06; int qtySold; double tax = 0, subtotal = 0; static double total; public: SoldBook calcTax() { this->tax = qtySold * retail * taxRate; return *this; } SoldBook calcSubtotal() { subtotal = (this->retail * qtySold) + tax; return *this; } void setQtySold(int qty) { this->qtySold = qty; } int getQtySold() { return qtySold; } double getSubtotal() { return subtotal; } double getTotal() { return total; } InventoryBook getBook(InventoryBook book) { return book; } };
我希望SoldBook对象能直接继承InventoryBook的所有数据,不想编写那种逐个成员赋值的转换函数(比如下面这种):
void converter(char[] title, char[] isbn, ...etc) { this->bookTitle = title; this->isbn = isbn; etc... }
我知道繁琐的实现方式,想寻求最简方案,比如类似saleBooks[0] = allBooks[0];的写法。
解决方案
方法1:添加隐式转换构造函数
在SoldBook类中添加一个接收InventoryBook引用的构造函数,编译器会自动利用它完成父类到子类的转换,实现直接初始化:
class SoldBook : public InventoryBook { // ... 原有成员 ... public: // 转换构造函数:用父类对象初始化子类 SoldBook(const InventoryBook& parent) : InventoryBook(parent) { // 初始化子类独有的成员,避免未定义值 qtySold = 0; tax = 0; subtotal = 0; } // ... 原有成员函数 ... };
使用示例:
InventoryBook allBooks[20]; // 假设allBooks[0]已完成初始化 SoldBook saleBook = allBooks[0]; // 直接用父类对象初始化子类 // 数组场景下的赋值 SoldBook saleBooks[20]; saleBooks[0] = SoldBook(allBooks[0]);
方法2:重载赋值运算符
如果需要给已存在的SoldBook对象赋值父类对象,重载operator=即可:
class SoldBook : public InventoryBook { // ... 原有成员 ... public: // 重载赋值运算符:从父类对象赋值到子类 SoldBook& operator=(const InventoryBook& parent) { // 调用父类的赋值运算符,自动拷贝父类所有成员 InventoryBook::operator=(parent); // 初始化子类独有的成员 qtySold = 0; tax = 0; subtotal = 0; return *this; } // ... 原有成员函数 ... };
使用示例:
SoldBook saleBook; saleBook = allBooks[0]; // 直接对已存在的子类对象赋值父类数据
核心说明
- 两种方法都无需手动拷贝父类的
bookTitle、qtyOnHand等成员,父类的默认拷贝构造/赋值运算符会自动处理所有protected和public成员的拷贝。 - 子类独有的成员(如
qtySold、tax)必须在构造函数或赋值运算符中显式初始化,避免出现未定义的垃圾值。
内容的提问来源于stack exchange,提问作者Dawit M
相关产品推荐
相关产品推荐

