C++基础:继承,子类继承父类有规范和要求

本文详细介绍了C++中的继承概念,包括继承语法、成员访问权限、构造顺序、同名隐藏、多种继承情况、派生对象与基类对象的关系、多重继承和菱形继承问题,以及如何解决菱形继承导致的冲突。通过实例解析了继承过程中的注意事项和访问控制,帮助理解C++的继承机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 语法

继承关系: A is a B
父类 / 子类
基类 / 派生类

继承语法:

class 派生类:public 基类 {
   
        成员
}

三角形和等腰三角形之间的继承关系

#include <iostream>
#include <cmath>
using namespace std;

class Triangle{
   
        int a,b,c;
public:
        Triangle(int a,int b,int c):a(a),b(b),c(c){
   }  //初始化列表
        int GetLength() const{
        // int GetLength(const Triangle* this)
                return a+b+c;
        }
        float GetArea() const{
   
                float q = GetLength()/2.0;
                return sqrt(q*(q-a)*(q-b)*(q-c));  //海伦公式
        }
};

// A is a B
class IsoscelesTriangle:public Triangle{
   
public:
        IsoscelesTriangle(int side,int iso):Triangle(side,iso,iso){
   }   // 直接使用父类的构造函数
};

int main(){
   
        int a,b,c;
        cin >> a >> b >> c;
        Triangle t(a,b,c);
        cout << t.GetLength() << " " << t.GetArea() << endl;

        IsoscelesTriangle iso(a,b);
        cout << iso.GetLength() << " " << iso.GetArea() << endl;    // 直接使用父类的成员函数
}

结果为:

3 5 5
13 7.15454
13 7.15454

所以在使用父类的成员变量时,应该注意一些问题:

  1. 如果父类没有默认构造函数,子类初始化必须调用父类的构造函数
  2. 子类的构造函数初始化列表只能初始化自身的成员变量,不能直接初始化父类的成员变量
#include <iostream>
#include <cmath>
using namespace std;

class Triangle{
   
protected:
        int a,b,c;
public:
        Triangle():a(0),b(0),c(0){
   }
        Triangle(int a,int b,int c):a(a),b(b),c(c){
   }  //初始化列表
        int GetLength() const{
        // int GetLength(const Triangle* this)
                return a+b+c;
        }
        float GetArea() const{
   
                float q = GetLength()/2.0;
                return sqrt(q*(q-a)*(q-b)*(q-c));  //海伦公式
        }
};

// A is a B
class IsoscelesTriangle:public Triangle{
   
public:
        // IsoscelesTriangle(int side,int iso):Triangle(side,iso,iso){}   // 直接使用父类的构造函数
        IsoscelesTriangle(int side,int iso){
   
                a = side;
                b = iso;
                c = iso;
        }    // 使用父类的成员变量
};

int main(){
   
        int a,b,c;
        cin >> a >> b >> c;
        Triangle t(a,b,c);
        cout << t.GetLength() << " " << t.GetArea() << endl;

        IsoscelesTriangle iso(a,b);
        cout << iso.GetLength() << " " << iso.GetArea() << endl;    // 直接使用父类的成员函数

        // 查看类的大小判断子类是否继承了父类的成员变量
        cout << sizeof(Triangle) << endl;
        cout << sizeof(IsoscelesTriangle) << endl;   // 子类继承父类所有的成员变量 
}

结果为:

3 5 5
13 7.15454
13 7.15454
12
12

继承只是代表拥有,但不代表能访问
子类在访问父类成员函数时会涉及到权限的问题
protected 保护:对继承的子类可以访问,不允许外界访问,权限在public和prive之间

2. 成员的访问权限

使用程序测试可用权限

#include <iostream>
using namespace std;

class Base{
   
public:
        void public_func(){
   
                cout << __func__ << endl;
        }
protected:
        void protected_func(){
   
                cout << __func__ << endl;
        }
private:
        void private_func(){
   
                cout << __func__ << endl;
        }
public:
        void test(){
   
                //类内成员函数可以访问所有成员函数
                public_func();
                protected_func();
                private_func();
        }
};

class Derive:public Base{
   
public:
        void func(){
   
                /* 对于public继承,子类内部可以访问父类的public和protected的成员 */
                public_func();
                protected_func();
                // private_func();
        }
};

int main(){
   
        Base b;
        b.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值