C++类与对象(1)基类与派生类

C++本来是在下学期的数据结构学的,但是本学期期末考试也会涉及,然后自己学习的话主要是结合菜鸟教程去理解这些内容。因为是期末考试必考内容,所以在这里做一个汇总。

类访问修饰符

感觉学习的时候还是要整体的学,意思是说,单独学习“类访问修饰符”的效果是不如在学习“类访问修饰符”的同时也学习“基类和派生类”。

详细的知识可以参考

​​​​​C++ 类访问修饰符 | 菜鸟教程 (runoob.com)

C++ 继承 | 菜鸟教程 (runoob.com)

这里尝试做个串联。

首先是“:”与“::”的区别,前者是继承,后者是调用。第一题的话,我们可以知道派生类可以从基类访问protected和public,我觉得之所以会有一个protected的区域应该是区别于对象和派生类的。派生类可以访问基类的protected而对象则不能。对象只能访问基类的public。

其次,为什么要有public和private的区别呢?结合菜鸟教程的例子我们可以很好地理解:

#include <iostream>
 
using namespace std;
 
class Box
{
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
 
   private:
      double width;
};
 
// 成员函数定义
double Box::getWidth(void)
{
    return width ;
}
 
void Box::setWidth( double wid )
{
    width = wid;
}
 
// 程序的主函数
int main( )
{
   Box box;
 
   // 不使用成员函数设置长度
   box.length = 10.0; // OK: 因为 length 是公有的
   cout << "Length of box : " << box.length <<endl;
 
   // 不使用成员函数设置宽度
   // box.width = 10.0; // Error: 因为 width 是私有的
   box.setWidth(10.0);  // 使用成员函数设置宽度
   cout << "Width of box : " << box.getWidth() <<endl;
 
   return 0;
}

可以知道,最主要的一个原因是因为我们希望一些变量是公有的或者是专有的。比如说在上例的长方体里,理论上来说每个长方体的长宽高不同(每个对象的长宽高不同),那长宽高设为专有就比较合适,但是我们设置长宽高的方法都是一样的,那么这个方法作为公有就比较合适。

 指向类的指针

tbh,我当时看到这个答案还蛮懵的,什么鬼。于是去菜鸟教程学习了下相关内容C++ 中指向类的指针 | 菜鸟教程 (runoob.com)

一个指向C++类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符->,就像访问指向结构的指针一样。与所有的指针一样,您必须在使用指针之前,对指针进行初始化。

下面的实例有助于更好地理解指向类的指针的概念:

#include <iostream>
 
using namespace std;

class Box
{
   public:
      // 构造函数定义
      Box(double l=2.0, double b=2.0, double h=2.0)
      {
         cout <<"Constructor called." << endl;
         length = l;
         breadth = b;
         height = h;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // Length of a box
      double breadth;    // Breadth of a box
      double height;     // Height of a box
};

int main(void)
{
   Box Box1(3.3, 1.2, 1.5);    // Declare box1
   Box Box2(8.5, 6.0, 2.0);    // Declare box2
   Box *ptrBox;                // Declare pointer to a class.

   // 保存第一个对象的地址
   ptrBox = &Box1;

   // 现在尝试使用成员访问运算符来访问成员
   cout << "Volume of Box1: " << ptrBox->Volume() << endl;

   // 保存第二个对象的地址
   ptrBox = &Box2;

   // 现在尝试使用成员访问运算符来访问成员
   cout << "Volume of Box2: " << ptrBox->Volume() << endl;
  
   return 0;
}

我觉得上面的这个实例最重要的是“一个指向C++类的指针与指向结构的指针类似”,回到这道题,我们可以把pointer a理解为指向ALPHA,而这个ALPHA类含有x和y。现在又把这个指针赋给b作为BETA的指针,但是我们知道BETA除了可以访问ALPHA的x,y外,还有自己的z和rotate3D这个方法,所以答案会说*a might not be a BETA,它只是ALPHA,但是ALPHA和BETA是不同的。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值