You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:55:29