c++ 派生类和基类之间的特殊关系

1.概述

1.基类指针可以在不进行显式类型转换的情况下指向派生类对象
2.基类引用可以在不进行显式类型转换的情况下引用派生类对象
3.引用兼容性属性可以将基类对象初始化为派生类对象,同样也可以将派生类对象赋给基类对象。

2.实例

2.1实例一
#include <iostream>

namespace SimpleTest
{
using namespace std;

class CParent
{
public:
    CParent();
    virtual ~CParent();
    virtual void TestComFunc();
    void TestParFunc();
private:
    int m_nParValue;
};

CParent::CParent():m_nParValue(0)
{
    cout<<"父类构造函数被调用"<<endl;
}
CParent::~CParent()
{
    cout<<"父类析构函数被调用"<<endl;
}
void CParent::TestComFunc()
{
    cout<<"父类方法(虚函数)被调用"<<endl;
}
void CParent::TestParFunc()
{
    cout<<"父类方法被调用"<<endl;
}

class CSub : public CParent
{
public:
    CSub();
    ~CSub();
    void TestComFunc();
    void TestSubFunc();
private:
    int m_nSubValue;
};

CSub::CSub():m_nSubValue(0)
{
    cout<<"子类构造函数被调用"<<endl;
}
CSub::~CSub()
{
    cout<<"子类析构函数被调用"<<endl;
}
void CSub::TestComFunc()
{
    cout<<"子类方法(重载父类方法)被调用"<<endl;
}
void CSub::TestSubFunc()
{
    cout<<"子类方法被调用"<<endl;
}

}

int main()
{
    SimpleTest::CParent* pMyClass = new SimpleTest::CSub;
    pMyClass->TestComFunc();
/// 基类指针指向派生类对象,调用派生类重新定义的同名方法,最终取决于指向的派生类对象,"工程模式"的实现。
    pMyClass->TestParFunc();
//  pMyClass->TestSubFunc(); 
/// 基类指针指向派生类对象,只能调用派生类重新定义的基类同名方法,其他派生类公有函数成员无法调用。
    delete pMyClass;
    pMyClass = NULL;

/// 输出:
/// 父类构造函数被调用
/// 子类构造函数被调用
/// 子类方法(重载父类方法)被调用
/// 父类方法被调用
/// 子类析构函数被调用
/// 父类析构函数被调用

    SimpleTest::CSub myClass;
    SimpleTest::CParent& rMyClass = myClass;
    rMyClass.TestComFunc();
    rMyClass.TestParFunc();

/// 输出:
/// 父类构造函数被调用
/// 子类构造函数被调用
/// 子类方法(重载父类方法)被调用
/// 父类方法被调用
/// 子类析构函数被调用
/// 父类析构函数被调用

    return 0;
}
2.2实例二
#include <iostream>

namespace SimpleTest
{
using namespace std;

class CParent
{
public:
    CParent();
    CParent(const CParent& OtherCParent);
    virtual ~CParent();
    CParent& operator=(const CParent& OtherCParent);
    int GetParValue();
    void SetParValue(int nValue);
private:
    int m_nParVal;
};
CParent::CParent()
{
}
CParent::CParent(const CParent& OtherCParent)
{
    m_nParVal = OtherCParent.m_nParVal;
    std::cout<<"基类复制构造函数被调用"<<std::endl;
}
CParent::~CParent()
{
}
CParent& CParent::operator=(const CParent& OtherCParent)
{
    m_nParVal = OtherCParent.m_nParVal;
    std::cout<<"基类赋值函数被调用"<<std::endl;
    return *this;
}
int CParent::GetParValue()
{
    return m_nParVal;
}
void CParent::SetParValue(int nValue)
{
    m_nParVal = nValue;
}


class CSub : public CParent
{
public:
    CSub();
    ~CSub();
    int GetSubValue();
    void SetSubValue(int nValue);
};
CSub::CSub()
{
}
CSub::~CSub()
{
}
int CSub::GetSubValue()
{
    return GetParValue();
}
void CSub::SetSubValue(int nValue)
{
    SetParValue(nValue);
}

}

int main()
{
    SimpleTest::CSub mySub;
    mySub.SetSubValue(10);
    std::cout<<mySub.GetSubValue()<<std::endl;
    SimpleTest::CParent myParent(mySub);
/// 将myParent初始化为嵌套在CSub对象mySub中的CParent对象。
    std::cout<<myParent.GetParValue()<<std::endl;

    mySub.SetSubValue(20);
    std::cout<<mySub.GetSubValue()<<std::endl;
    myParent = mySub;
/// CSub对象mySub的基类部分被复制给myParent。
    std::cout<<myParent.GetParValue()<<std::endl;

/// 输出:
/// 10
/// 基类复制构造函数被调用
/// 10
/// 20
/// 基类赋值函数被调用
/// 20
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中,派生类基类之间建立了一种继承关系派生类是基于基类创建的,它继承了基类的成员和行为,并且可以在此基础上添加新的成员和行为。 派生类通过关键字`class`或`struct`来定义,后跟派生类的名称,再使用关键字`:`指定基类派生类可以继承基类的公有成员和受保护成员,但不能继承基类的私有成员。 派生类可以通过继承来获得以下几个方面的优势: 1. 代码重用:派生类可以重用基类中的成员和方法,无需重新编写相同的代码。 2. 扩展功能:派生类可以在基类的基础上添加新的成员和方法,从而扩展基类的功能。 3. 多态性(Polymorphism):派生类可以作为基类的对象使用,从而实现多态性。这意味着可以使用基类的指针或引用来操作派生类对象。 4. 继承层次结构:派生类可以继续被其他派生类所继承,从而形成继承层次结构。 在派生类中,可以使用关键字`override`来重写基类中的虚函数,并使用`super`关键字来调用基类的函数。这样可以在派生类中改变基类函数的行为。 继承关系可以通过多种形式来实现,包括公有继承、私有继承和保护继承。每种继承方式都决定了派生类基类成员的访问权限。 总之,派生类基类之间关系是一种继承关系,通过继承,派生类可以获得基类的成员和行为,并且可以在此基础上添加新的成员和行为。这种关系使得代码更加灵活和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值