C++父子类相互赋值

在C++中,父类对象(基类对象)不能直接赋值给子类对象(派生类对象),因为子类可能包含父类中没有的成员变量或成员函数,这会导致信息丢失或类型不匹配的问题。然而,子类对象可以赋值给父类对象的引用或指针,但这需要理解其中的“切片”现象和“多态”的概念。

子类对象给父类对象赋值(实际上是指向或引用)

当你尝试将一个子类对象赋值给一个父类类型的变量时,实际上是在进行引用或指针的赋值,而不是对象内容的直接复制。这通常是通过使用基类指针或引用来实现的,允许在基类指针或引用上操作派生类对象,这是多态的基础。

class Base {  
public:  
    virtual void show() { std::cout << "Base show" << std::endl; }  
};  
  
class Derived : public Base {  
public:  
    void show() override { std::cout << "Derived show" << std::endl; }  
    void derivedOnlyFunction() { std::cout << "Derived only function" << std::endl; }  
};  
  
int main() {  
    Derived d;  
    Base* basePtr = &d; // 子类对象地址赋值给父类指针  
    Base& baseRef = d; // 子类对象引用赋值给父类引用  
  
    basePtr->show(); // 调用Derived的show,展示了多态  
    // basePtr->derivedOnlyFunction(); // 编译错误,因为Base类没有这个函数  
  
    return 0;  
}
父类对象给子类对象赋值

直接将父类对象赋值给子类对象在C++中是不允许的,因为这会导致类型不匹配。如果你确实需要从父类对象“创建”一个子类对象,你需要明确地进行类型转换或构造一个新的子类对象,并可能需要从父类对象中提取必要的信息来初始化子类对象。

Derived d2 = static_cast<Derived>(baseObj); // 这是错误的,因为不能直接转换类型  
  
// 正确的做法可能是:  
Base baseObj;  
// 假设有某种方式可以初始化Derived对象  
Derived d3(baseObj.someMember); // 使用父类对象的成员来初始化子类对象  
  
// 或者,如果你确实需要转换指针或引用(假设你确认转换是安全的)  
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);  
if (derivedPtr) {  
    // 现在你可以安全地使用derivedPtr,因为它指向Derived对象  
}

 

注意,dynamic_cast在运行时检查转换的安全性,如果basePtr不指向Derived类型或其子类型的对象,则转换失败,derivedPtr将会是nullptrstatic_cast在编译时检查转换的合法性,但不进行运行时类型检查,因此它不能用于基类指针到派生类指针的向下转换,除非你可以确保转换的安全性(比如通过其他方式已经确认了对象的实际类型)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值