C++私有继承(一)

C++私有继承(一)

C++中的继承分为公有继承、私有继承和受保护继承。本文主要介绍私有继承的用法和示例。

什么是私有继承

私有继承表示继承的成员在该类的外部是不可见的。这意味着,无法通过基类的指针或引用访问派生类从基类继承的成员。私有继承是一种is-a关系,表示派生类是基类的一种类型。

私有继承的语法

私有继承的语法为:

class BaseClass {
   // 基类成员
};

class DerivedClass : private BaseClass {
   // 派生类成员
};

在上面的代码中,我们使用了private关键字来表示私有继承。

私有继承的示例

下面的代码演示了私有继承的用法和示例。

#include <iostream>

class Animal {
public:
    void eat() {
        std::cout << "Animal eat" << std::endl;
    }
    void drink() {
        std::cout << "Animal drink" << std::endl;
    }
};

class Dog : private Animal {
public:
    void bark() {
        std::cout << "Dog bark" << std::endl;
    }
};

int main() {
    Dog dog;

    // 正确,调用Dog的成员函数
    dog.bark();

    // 错误,Dog从Animal私有继承,基类成员不可见
    dog.eat();

    // 错误,Dog从Animal私有继承,基类成员不可见
    dog.drink();

    return 0;
}

在上面的代码中,我们定义了一个基类Animal,它有两个成员函数eat()和drink()。然后我们定义一个派生类Dog,使用private关键字表示私有继承。派生类Dog新增了一个成员函数bark()。当我们尝试访问派生类Dog继承自基类Animal的成员函数时,由于私有继承的限制,编译器会报错,这就是私有继承的用法了。

下面再看一段代码:

#include <iostream>

class Animal {
private:
    int legs;
public:
    Animal(int num_legs) {
        legs = num_legs;
    }
    int get_legs() {
        return legs;
    }
};

class Dog : private Animal {
private:
    int age;
public:
    Dog(int dog_age) : Animal(4) {
        age = dog_age;
    }
    void bark() {
        std::cout << "Dog bark" << std::endl;
    }
    int get_age() {
        return age;
    }
};

int main() {
    Dog dog(3);
    std::cout << "Dog age: " << dog.get_age() << std::endl;
    std::cout << "Dog legs: " << dog.get_legs() << std::endl;
    return 0;
}

在上面的代码中,我们定义了一个基类Animal,封装了私有成员legs,并且定义了构造函数和成员函数get_legs()。然后我们定义了一个派生类Dog,使用private关键字表示私有继承。派生类Dog新增了一个成员变量age和一个成员函数bark()。我们在Dog的构造函数中,调用了基类Animal的构造函数,并传入了4作为形参。然后在main函数中,我们创建了一个Dog对象,并分别访问了派生类Dog的成员函数和基类Animal的成员函数。

结论

私有继承表示继承的成员在该类的外部是不可见的,无法通过基类的指针或引用访问派生类从基类继承的成员。私有继承是一种is-a关系,表示派生类是基类的一种类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++私有继承(一) - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • springboot如何使用@ConfigurationProperties封装配置文件

    使用@ConfigurationProperties可以将配置文件中的属性值绑定到JavaBean中,方便管理和使用。下面是完整的“springboot如何使用@ConfigurationProperties封装配置文件”的攻略: 1. 引入依赖 在pom.xml中引入spring-boot-configuration-processor依赖: <de…

    other 2023年6月25日
    00
  • hbase运行问题:zk默认端口2181被占用问题解决!

    以下是关于“HBase运行问题:zk默认端口2181被占用问题解决”的完整攻略,包括问题原因、解决方法、示例说明和注意事项。 问题原因 在启动HBase时,如果zk默认端口2181被占用,会导致HBase无法正常启动。 解决方法 以下是解决zk默认端口2181被占用问题的方法: 查占2181端口的进程 lsof -i :2181 在这个示例中,我们使用lso…

    other 2023年5月8日
    00
  • vscode搜索所有文件夹中所有文件的方法

    以下是关于“VS Code搜索所有文件夹中所有文件的方法”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 VS Code是一款流行的开源代码编辑器,支持多种编程语言和框架。在VS Code中,可以使用搜索功能查找所有文件夹中所有文件。 步骤 以下是在VS Code中搜索所有文件夹中所有文件的步骤: 打开VS Code:打开VS Code编辑器。 打开搜…

    other 2023年5月7日
    00
  • js如何将字符串数字转换成long

    JS如何将字符串数字转换成long 在 JavaScript 中,由于其中的数值类型都是基于64位的浮点数实现的,因此 JavaScript 中没有长整型。然而,在一些情况下,我们可能需要处理比 JavaScript 的 Number 类型更大的整数,例如处理大数字计算、密码学应用等。在这些情况下,我们需要使用 BigInt 类型。但有时候我们也会遇到需要将…

    其他 2023年3月28日
    00
  • object转为byte数组

    将对象转换为字节数组是一种常见的操作,可以在网络传输和数据存储中使用。以下是将对象转换为字节数组的完整攻略: 步骤1:实现接口 要将对象转换为字节数组,必须实现Serializable接口。这个接口没有任何方法,只是一个标记接口用于指示该类可以序列化。 以下是一个示例: import java.io.Serializable; public class Pe…

    other 2023年5月6日
    00
  • Angularjs 设置全局变量的方法总结

    AngularJS 设置全局变量的方法总结 在AngularJS中,可以通过不同的方法来设置全局变量。下面是两种常用的方法示例: 方法一:使用$rootScope $rootScope是AngularJS中的根作用域,它可以在整个应用程序中共享数据。要设置全局变量,可以将变量添加到$rootScope对象中。 // 在控制器中设置全局变量 app.contr…

    other 2023年7月29日
    00
  • jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)

    jQuery 瀑布流 浮动布局(一)- 延迟 AJAX 加载图片 瀑布流布局介绍 瀑布流布局(Waterfall Flow),又称为瀑布流式设计、瀑布流式布局等,是一种常见的页面布局方式。通过把页面元素摆放在不同的列和不同的位置上,让页面呈现出错落有致、层次分明的效果。瀑布流布局常被用来展示图片、商品等,非常适用于视觉效果要求较高的界面,比如 Pintere…

    other 2023年6月25日
    00
  • php项目docker打包部署

    PHP 项目 Docker 打包部署 Docker 是当今最流行的容器化技术,可以快速构建、部署和运行基于容器的应用程序。使用 Docker 能够轻松地打包应用程序和相关依赖,并在任何地方运行。本文将介绍如何使用 Docker 打包和部署 PHP 项目。 什么是 Docker? Docker 是一种开源的容器化平台,它能够将应用程序及其依赖项打包为标准化的 …

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部